๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/Redis

[Redis] ch.20 ๊ฒ€์ƒ‰ ๊ตฌํ˜„ํ•˜๊ธฐ

by OR15A 2024. 1. 31.

https://github.com/HongHyeongJu/StudySpace/blob/main/database/Redis/Redis_%ED%95%99%EC%8A%B5%EB%85%B8%ED%8A%B8_07.md

์œ ๋ฐ๋ฏธ Redis : ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ Redis ์™„๋ฒฝ ๊ฐ€์ด๋“œ

ch.20 - ๊ฒ€์ƒ‰ ๊ตฌํ˜„ํ•˜๊ธฐ



๊ฒ€์ƒ‰๊ตฌํ˜„

  • ์ƒํ™ฉ์— ๋”ฐ๋ผ ์„ ํƒํ•˜๊ธฐ
    • ํ•ด์‹œ์˜ ์–ด๋–ค ํ•„๋“œ์— ๋Œ€ํ•ด์„œ ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€
    • ํ’€ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์„ ์›ํ•œ๋‹ค๋ฉด ํ•„๋“œํƒ€์ž…์€ ํ…์ŠคํŠธ๋กœ
    • ์‹ค์ œ๋กœ ๊ทธ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜ ์ž‘์„ฑํ•˜๊ธฐ
    • ์ธ๋ฑ์Šค ์ƒ์„ฑ ์‹œ์ ์„ ๊ฒฐ์ •ํ•˜๊ธฐ

์ธ๋ฑ์Šค ์ƒ์„ฑ ํ•จ์ˆ˜

  • ๊ฐ•์˜๋Š” Node.js๋ฅผ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ํ•„๊ธฐ
    • ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์ ‘๋‘์–ด์— ์˜คํƒˆ์ž ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ธฐ(์ž๋ฐ”๋Š” ๋ฉ”์„œ๋“œ๊ฒ ์ง€)
    • ex) public String itemsKey(Strting keyword){return "ietems#"+keyword; }

์ธ๋ฑ์Šค ์ƒ์„ฑ ์‹œ์ 

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋˜๊ณ  ์ฒ˜์Œ์œผ๋กœ Redis์— ์ ‘์†ํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” Redis๋ฅผ ํ™•์ธํ•˜๊ณ  ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์ธ๋ฑ์Šค๋กœ ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์„๊ฒƒ์ž„
  • ์ดํ›„ ๋งŒ๋“ค๋ ค๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ
    • ์ƒ์„ฑX -> ๋งŒ๋“ค๊ธฐ
    • ์ƒ์„ฑO -> ์•„๋ฌด๊ฒƒ๋„ ์•ˆํ•˜๊ธฐ
  • FT._LIST
    • ๋ชจ๋“  ์ธ๋ฑ์Šค๋กœ ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›๋Š” ๋ช…๋ น์–ด

๊ฒ€์ƒ‰์–ด ํŒŒ์‹ฑํ•˜๊ธฐ

  • ๊ฐ•์˜์—์„œ ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜
    • ๋งค๊ฐœ๋ณ€์ˆ˜ 2๊ฐœ (์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’, ๋ฐ˜ํ™˜ํ•  ์ตœ๋Œ€ ๊ฒ€์ƒ‰๊ฒฐ๊ณผ ๊ฐœ์ˆ˜)
  • ์ž…๋ ฅ๊ฐ‘ ์ „์ฒ˜๋ฆฌ
    • ํŠน์ˆ˜๊ธฐํ˜ธ ์‚ญ์ œํ•˜๊ธฐ : ์ •๊ทœ์‹ ์ด์šฉ,
    • ์–‘๋ ๊ณต๋ฐฑ์ œ๊ฑฐ
    • ์ค‘๊ฐ„๊ณต๋ฐฑ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ
    • ๊ณต๋ฐฑ ์‚ฌ์ด์— ๋‹จ์–ด๊ฐ€ ์žˆ์œผ๋ฉด % ํผ์„ผํŠธ ๊ธฐํ˜ธ ์ถ”๊ฐ€ํ•˜๊ธฐ, ์—†์œผ๋ฉด ๋นˆ๋ฌธ์ž์—ด๋กœ ์น˜ํ™˜
    • AND์—ฐ์‚ฐ ํ•  ๊ฒƒ์ธ์ง€, OR์—ฐ์‚ฐ ํ•  ๊ฒƒ์ธ์ง€ ์ •ํ•˜๊ธฐ

๊ฒ€์ƒ‰ ์‹คํ–‰ํ•˜๊ธฐ

  • ๊ฐ•์˜์—์„œ ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜ ํ•„๊ธฐ
    • ์ •๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ
      • ๊ธฐํ˜ธ์ œ๊ฑฐ๋กœ ์ธํ•ด ๋นˆ๋ฌธ์ž์—ด์ด ๋œ๋‹ค๋ฉด DB์˜ ๋ชจ๋“  ํ•ญ๋ชฉ ๋ฆฌํ„ด -> ์œ ํšจX
      • ๋นˆ๋ฌธ์ž๋ผ๋ฉด ๋นˆ ๋ฐฐ์—ด ๋ฆฌํ„ดํ•˜๊ธฐ == ์ฐพ์„ ์ˆ˜ ์—†๋‹ค
    • ์‹ค์ œ ๊ฒ€์ƒ‰ ์ˆ˜ํ–‰ํ•˜๊ธฐ
    • ์—ญ์ง๋ ฌํ™” ํ•˜๊ณ  ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ

๋ชจ์˜ ๋ฐ์ดํ„ฐ ๋ณด์ถฉํ•˜๊ธฐ

  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์œผ๋ฉด ๊ฒ€์ƒ‰ ์ž‘์—… ์ตœ์ ํ™” ์ž‘์—…์„ ํ›จ์”ฌ ์ž˜ํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ทธ ์ดํ›„๋กœ Node.js ์„ค๋ช…

RediSearch์™€ TF-IDF

  • ๊ฒ€์ƒ‰ ์‹œ ์„ค๋ช…์ด ์•„๋‹Œ ์ด๋ฆ„์— ๊ฒ€์ƒ‰์–ด๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์šฐ์„ ์‹œ๋˜๋„๋ก ํ•˜๊ธฐ
  • RediSearch์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘๋™์„ ์ดํ•ดํ•˜๋ฉด๋จ
  • TF-IDF ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ์„œ ๋‹ค์–‘ํ•œ ๋ฌธ์ž์—ด๋“ค์„ ์‚ดํŽด๋ณด๊ณ  ์ฃผ์–ด์ง„ ๊ฒ€์ƒ‰์–ด์— ๋Œ€ํ•ด ์–ด๋–ค ๊ฒƒ์ด ๊ด€๋ จ๊นŠ์€์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Œ
    • TF-IDF๋Š” ๊ฒ€์ƒ‰์–ด ๋นˆ๋„๋ฅผ ์—ญ ๋ฌธ์„œ ๋นˆ๋„์— ๊ณฑํ•ด์„œ ์ž‘๋™ํ•จ
    • ๊ณฑํ•˜๋ฉด ๊ฐ๊ฐ์˜ ๋ฌธ์ž์—ด์— ์ ์ˆ˜๊ฐ€ ๋งค๊ฒจ์ง€๊ณ  ์ ์ˆ˜๊ฐ€ ๋†’์œผ๋ฉด ๊ทธ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์™€ ๋” ๊ด€๋ จ์ด ๊นŠ๋‹ค๋Š”๊ฑธ ์˜๋ฏธํ•จ
    • ๊ฒ€์ƒ‰์–ด ๋นˆ๋„๋Š” ๋ฌธ์ž์—ด ์•ˆ์—์„œ ์–ด๋–ค ๊ฒ€์ƒ‰์–ด๊ฐ€ ๋ช‡๋ฒˆ์ด๋‚˜ ๋“ฑ์žฅํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ทธ๊ฑธ ๋ฌธ์ž์—ด ์•ˆ์˜ ์ด ๋‹จ์–ด ๊ฐœ์ˆ˜๋กœ ๋‚˜๋ˆ ์„œ ๊ณ„์‚ฐํ•˜๋Š” ๋“ฑ์˜ ๊ณ„์‚ฐ ๋ฐฉ์‹์ด ์žˆ์Œ
    • ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒ€์ƒ‰์–ด๋“ค ์‚ฌ์ด์— ๋‹จ์–ด๊ฐ€ ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€, ํ˜น์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋‹จ์–ด๊ฐ€ ๋ฌธ์ž์—ด์— ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ๊ณ ๋ คํ•จ
    • ๊ฐœ๋ณ„ ๊ฒ€์ƒ‰์–ด/ํ•„๋“œ์— ๊ฐ€์ค‘์น˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Œ

ํ•„๋“œ์— ๊ฐ€์ค‘์น˜ ์ ์šฉํ•˜๊ธฐ

  • ํ•„๋“œ์— ๊ฐ€์ค‘์น˜ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ
    • ์ด๋ฆ„์— ๊ฒ€์ƒ‰์–ด 1๋ฒˆ < ์„ค๋ช…์— ๊ฒ€์ƒ‰์–ด ๋ฐ˜๋ณต n๋ฒˆ : ๊ฒ€์ƒ‰ ์˜๋„์— ๋งž์ง€ ์•Š์Œ
    • ex) ๊ฐœ๋ณ„ ํ•ด์‹œ์˜ nameํ•„๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  chair๋ฅผ ์ฐพ๊ณ , ์ฐพ์œผ๋ฉด 5๋ฐฐ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ ์šฉํ•˜๋ผ
    • AND๋Š” OR๋กœ ๋ณ€๊ฒฝ

EXPLAINCLI๋ฅผ ์ด์šฉํ•œ ์ฟผ๋ฆฌ

  • EXPLAINCLI
    • ์‹ค์ œ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์ง„ ์•Š์ง€๋งŒ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋  ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š”์ง€์— ๊ด€๋ž€ ์ •๋ณด๋ฅผ ์ค„ ๊ฒƒ์ž„(์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ์‹คํ–‰๊ณ„ํš ๊ฐ™์€๊ฑด๊ฐ€)
    • ๊ฐœ๋ฐœ์ž์˜ ์ฟผ๋ฆฌ ์˜๋„์— ๋งž๊ฒŒ ํ•ด์„๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•จ
    • +chair(expanded)์™€ ๊ฐ™์€ RediSearch์˜ ์Šคํ…Œ๋ฐ์„ ๊ณ ๋ คํ•ด์•ผํ•จ
    • ๊ฐ ํ•ญ์— ๊ด„ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•จ
      • FT.EXPLAINCLI idx:items '(@name:(chair))|(@description:(chair))'

PROFILE๋กœ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ํ™•์ธํ•˜๊ธฐ

  • FT.PROFILE
    • ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , Redis๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๊ทธ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•จ
    • ์ฟผ๋ฆฌ ๋ช…๋ น์˜ ๊ตฌ๋ฌธ๋“ค์„ ์•ฝ๊ฐ„ ์‹œํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ์Œ
    • FT.PROFILE idx:items SEARCH QUERY 'chairs' LIMIT 0 0

์ •๋ ฌ๊ณผ ๊ฒ€์ƒ‰

  • RediSearch์™€ ์ •๋ ฌ์— ๊ด€ํ•œ ์ฃผ์˜์‚ฌํ•ญ
    • RediSearch ์ž์ฒด๋กœ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Œ(sort ํ•„์š” ์—†์Œ)
    • ๋Œ€์‹  ์ผ๋ฐ˜์ ์ธ ๊ฒ€์ƒ‰์„ ํ•˜๊ณ  ์ฟ ๋ฆฌ์˜ ์ผ๋ถ€๋กœ์„œ ์–ด๋–ค ํ•„๋“œ๋กœ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•ด ๋‹ฌ๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ
    • ์ •๋ ฌ์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ธ๋ฑ์Šค๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•จ(๊ตฌ์ œ์ฒ™์œผ๋กœ ์ •๋ ฌ์— ์‚ฌ์šฉํ•  ํ•„๋“œ ์•Œ๋ ค์ฃผ๊ธฐ)
    • ์ œํ•œ
      • ํ•œ ๋ฒˆ์— ํ•œ ํ•„๋„๋ฅด๋งŒ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Œ
      • ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ •๋ ฌ ๊ฒฐ๊ณผ๋งŒ ์–ป์„ ์ˆ˜ ์žˆ์Œ
    • ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ •๋ ฌ์„ ํ•˜๋ ค๋ฉด ๋ชจ๋“  ํ•„๋“œ์ค‘ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋Š” ํ•„๋“œ, ๊ทธ๋ ‡์ง€ ์•Š์€ ํ•„๋“œ๋ฅผ ๋ฐํ˜€์•ผํ•จ
  • ์ธ๋ฑ์Šค ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ• ๋•Œ๋งˆ๋‹ค ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋งŒ ์žˆ์Œ. ํ•„๋“œ ์‚ญ์ œ X, ๊ธฐ์กด ํ•„๋“œ ๋ณ€๊ฒฝ X
  • ๋”ฐ๋ผ์„œ ์ธ๋ฑ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑํ•ด์•ผํ•จ

๊ธฐ์กด ์ธ๋ฑ์Šค ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ

๊ฒ€์ƒ‰ ์‹คํ–‰ํ•˜๊ธฐ

  • Node.js ์ฝ”๋“œ ๋‚ด์šฉ

๊ฒ€์ƒ‰๊ฒฐ๊ณผ ์—ญ์ง๋ ฌํ™” ํ•˜๊ธฐ

  • ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜๋ฉด ์ด ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜์ธ total๊ณผ ๋ฐœ๊ฒฌํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ ํ•ด์‹œ๋กœ ๋œ ๋ฐฐ์—ด์ด ๋ฐ˜ํ™˜๋จ
    • ์‹ค์ œ๋กœ ๊ฐ์ฒด๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด
    • ๋ชจ๋“  ๊ฐ์ฒด์—๋Š” id๊ฐ€ ์žˆ์Œ
    • ๊ทธ id๋Š” ํ•ญ๋ชฉ ํ•ด์‹œ๊ฐ€ ์ €์žฅ๋œ ๊ณณ์˜ ํ‚ค
    • value๋Š” ํ•ญ๋ชฉ ํ•ด์‹œ ์ž์ฒด
  • ๊ฐ์ฒด๋ฅผ ๋ถ„ํ•ดํ•ด์„œ id์™€ value๋กœ ํ• ๋‹นํ•˜๊ธฐ