Redis 기초

Redis 기초

๐Ÿš€ ์ดˆ๋ณด์ž๋„ ํ•œ๋ˆˆ์— ์ดํ•ดํ•˜๋Š” Redis ํ•ต์‹ฌ ์š”์•ฝ ๋…ธํŠธ

Redis(๋ ˆ๋””์Šค)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”? ์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ•  ํ•„์š” ์—†์ด, ์ปดํ“จํ„ฐ ์„ธ์ƒ์˜ **'์ดˆ๊ณ ์† ์ž„์‹œ ๋ฉ”๋ชจ์žฅ'**์ด๋ผ๊ณ  ์ดํ•ดํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB)๊ฐ€ ํฌ๊ณ  ๋ฌด๊ฑฐ์šด '์ฒ ์ œ ์„œ๋ฅ˜ํ•จ'์ด๋ผ๋ฉด, Redis๋Š” ์ฑ…์ƒ ์œ„์— ๋‘๊ณ  ๋ฐ”๋กœ๋ฐ”๋กœ ์ ๊ณ  ์ง€์šฐ๋Š” 'ํฌ์ŠคํŠธ์ž‡'๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ๊ฐ€ ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ(RAM)์— ์ง์ ‘ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๊ทผ ์†๋„๊ฐ€ ์ƒ์ƒ์„ ์ดˆ์›”ํ•˜๊ฒŒ ๋น ๋ฆ…๋‹ˆ๋‹ค.


๐Ÿ—บ๏ธ ํ•œ๋ˆˆ์— ๋ณด๋Š” Redis ๊ธฐ๋ณธ ๋™์ž‘ ํ๋ฆ„

๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ์šฉ ๋ฐฉ์‹์ธ ์บ์‹œ(Cache) ํŒจํ„ด์˜ ํ๋ฆ„์ž…๋‹ˆ๋‹ค. DB๋ฅผ ๋งค๋ฒˆ ๋’ค์ง€๋Š” ๋Œ€์‹ , ๋น ๋ฅธ ๋ฉ”๋ชจ์žฅ์ธ Redis๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๋Š” ์›๋ฆฌ์ž…๋‹ˆ๋‹ค.

[์‚ฌ์šฉ์ž ์š”์ฒญ] 
     โ”‚
     โ–ผ
[Redis (ํฌ์ŠคํŠธ์ž‡)] โ”€โ”€(๋ฐ์ดํ„ฐ ์žˆ์Œ! โšก)โ”€โ”€> ๋ฐ”๋กœ ์‘๋‹ต ๋ฐ˜ํ™˜ (๋น ๋ฆ„)
     โ”‚
(๋ฐ์ดํ„ฐ ์—†์Œ ๐Ÿข)
     โ”‚
     โ–ผ
 [๋ฉ”์ธ DB (์„œ๋ฅ˜ํ•จ)] โ”€โ”€(๋ฐ์ดํ„ฐ ์ฐพ์Œ)โ”€โ”€> [Redis์— ๋ณต์‚ฌ] ํ›„ ์‘๋‹ต ๋ฐ˜ํ™˜

๐Ÿ”ต 1. ๊ธฐ์ดˆ โ€” Redis๊ฐ€ ์œ ๋… ๋น ๋ฅธ ์ด์œ 

"์™œ ๋‹ค๋“ค Redis๊ฐ€ ๋น ๋ฅด๋‹ค๊ณ  ๊ทน์ฐฌํ• ๊นŒ์š”?" ๊ทธ ๋น„๋ฐ€์€ ์ €์žฅ ์œ„์น˜์™€ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋… ์„ค๋ช…
์ธ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ SSD/HDD๊ฐ€ ์•„๋‹Œ RAM์— ์ €์žฅ โ†’ ์ˆ˜๋ฐฑ ๋ฐฐ ๋น ๋ฅธ ์ ‘๊ทผ ์†๋„ ๋ณด์žฅ
์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์š”์ฒญ์„ ํ•œ ์ค„๋กœ ์„ธ์›Œ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ โ†’ ๋ฐ์ดํ„ฐ ๊ผฌ์ž„(Race condition) ์›์ฒœ ์ฐจ๋‹จ

๐ŸŸข 2. ์˜์†์„ฑ โ€” ์ „์›์ด ๊บผ์ ธ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€ํ‚ค๋Š” ๋ฒ•

"๋ฉ”๋ชจ๋ฆฌ(RAM)์— ์ €์žฅํ•˜๋ฉด ์ปดํ“จํ„ฐ๊ฐ€ ๊บผ์กŒ์„ ๋•Œ ๋‹ค ๋‚ ์•„๊ฐ€๋Š” ๊ฑฐ ์•„๋‹ˆ์•ผ?" ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Redis๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋””์Šคํฌ์— ๋ฐฑ์—…ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌด๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋… ์„ค๋ช…
RDB (์Šค๋ƒ…์ƒท) ํŠน์ • ์‹œ์ ์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์ง„ ์ฐ๋“ฏ ๋””์Šคํฌ์— ์ €์žฅ (๋ณต๊ตฌ ๋น ๋ฆ„)
AOF (๋กœ๊ทธ) ๋ชจ๋“  ์“ฐ๊ธฐ ๋ช…๋ น์–ด๋ฅผ ์ผ๊ธฐ์žฅ์ฒ˜๋Ÿผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ธฐ๋ก (๋ฐ์ดํ„ฐ ์†์‹ค ์ตœ์†Œํ™”)
์‹ค๋ฌด ์ ์šฉ ๋‘ ๋ฐฉ์‹์„ ๋ชจ๋‘ ์ผœ์„œ ์„œ๋กœ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 

๐ŸŸ  3. ์บ์‹œ โ€” ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ž„์‹œ ์ €์žฅ ์ „๋žต

Redis๋ฅผ ์บ์‹œ๋กœ ์“ธ ๋•Œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ธ์ œ ์ง€์šฐ๊ณ  ์–ธ์ œ ์ฑ„์šธ์ง€๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋… ์„ค๋ช…
Cache-aside Redis๋ถ€ํ„ฐ ํ™•์ธ โ†’ ์—†์œผ๋ฉด DB ์กฐํšŒ ํ›„ Redis์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋ณธ ํŒจํ„ด
Cache Invalidation DB ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ Redis ์บ์‹œ๋ฅผ ์•„์˜ˆ ์‚ญ์ œ (๋ฎ์–ด์“ฐ๊ธฐ๋Š” ์˜ค๋ฅ˜ ์œ„ํ—˜์ด ํผ)
Eviction Policy ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฝ‰ ์ฐผ์„ ๋•Œ์˜ ์‚ญ์ œ ์ „๋žต (์˜ˆ: ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๊ฒƒ ์‚ญ์ œ vs ๊ฐ€์žฅ ์ ๊ฒŒ ์“ด ๊ฒƒ ์‚ญ์ œ)

๐Ÿ”ด 4. ์ž๋ฃŒ๊ตฌ์กฐ โ€” ์ƒํ™ฉ๋ณ„ ๋งž์ถค ๋„๊ตฌ 5๊ฐ€์ง€

Redis๋Š” ๋‹จ์ˆœํ•œ ๋ฉ”๋ชจ์žฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ ์„ค๋ช…
String ๋‹จ์ˆœ key-value ๊ตฌ์กฐ. ๊ธฐ๋ณธ์ ์ธ ์บ์‹ฑ์ด๋‚˜ ์กฐํšŒ์ˆ˜ ์นด์šดํ„ฐ์— ์ ํ•ฉ
Hash ํ•„๋“œ-๊ฐ’ ๋ฌถ์Œ. ์œ ์ € ํ”„๋กœํ•„์ฒ˜๋Ÿผ ํ•œ ๋Œ€์ƒ์˜ ์†์„ฑ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ ์œ ์šฉ
List ์ˆœ์„œ ์žˆ๋Š” ๋ชฉ๋ก. ์ฑ„ํŒ… ๋‚ด์—ญ, ์•Œ๋ฆผ, ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๋ฉ”์‹œ์ง€ ํ์— ์‚ฌ์šฉ
Set ์ค‘๋ณต ์—†๋Š” ์ง‘ํ•ฉ. '์ข‹์•„์š”' ์ค‘๋ณต ๋ฐฉ์ง€, ๊ต์ง‘ํ•ฉ/ํ•ฉ์ง‘ํ•ฉ ์—ฐ์‚ฐ์— ํ•„์ˆ˜
Sorted Set ์ ์ˆ˜ ๊ธฐ๋ฐ˜ ์ž๋™ ์ •๋ ฌ. ์‹ค์‹œ๊ฐ„ ๊ฒŒ์ž„ ๋žญํ‚น์ด๋‚˜ ์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด ๊ตฌํ˜„์˜ ๊ฝƒ

๐ŸŸฃ 5. ๋ฉ”์‹œ์ง• โ€” ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹

Redis๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„, A์—์„œ B๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ด์ฃผ๋Š” ์šฐ์ฒด๋ถ€ ์—ญํ• ๋„ ์•„์ฃผ ์ž˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋… ์„ค๋ช…
๋ฉ”์‹œ์ง€ ํ (List) ์ž‘์—…์„ ์ค„ ์„ธ์šฐ๊ณ  ์ฐจ๋ก€๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ (์ˆ˜์‹ ์ž๊ฐ€ 1๋ช…)
Pub/Sub ๋ผ๋””์˜ค ๋ฐฉ์†ก์ฒ˜๋Ÿผ ๋ฐœํ–‰ํ•˜๋ฉด ๊ตฌ๋…์ž ์ „์ฒด์—๊ฒŒ ๋™์‹œ ์ „๋‹ฌ (์‹ค์‹œ๊ฐ„ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ)

๐ŸŸก 6. ๊ณ ๊ฐ€์šฉ์„ฑ โ€” ์„œ๋ฒ„๊ฐ€ ์ ˆ๋Œ€ ์ฃฝ์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฒ•

์„œ๋น„์Šค๊ฐ€ ์ปค์ง€๋ฉด Redis ์„œ๋ฒ„ ํ•œ ๋Œ€๋กœ๋Š” ๋ถˆ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๊ณ ์žฅ ๋‚˜๋„ ์„œ๋น„์Šค๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ฐœ๋… ์„ค๋ช…
Sentinel ๋ณ„๋„ ๊ฐ์‹œ์ž๊ฐ€ ์žฅ์• ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ๋ณด์กฐ(Slave)๋ฅผ ๋ฉ”์ธ(Master)์œผ๋กœ ์ž๋™ ์Šน๊ฒฉ (์ค‘์†Œ๊ทœ๋ชจ์šฉ)
Cluster ์„œ๋ฒ„๋ผ๋ฆฌ ์„œ๋กœ ๊ฐ์‹œํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ชผ๊ฐœ์„œ ๋ถ„์‚ฐ ์ €์žฅ. ๋ฌดํ•œ ํ™•์žฅ ๊ฐ€๋Šฅ (๋Œ€๊ทœ๋ชจ์šฉ)

โšช 7. ์‹ฌํ™” ๊ฐœ๋… โ€” ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€๊ธฐ

๊ธฐ๋ณธ๊ธฐ๋ฅผ ์ตํ˜”๋‹ค๋ฉด, ์‹ค๋ฌด์—์„œ ๋งˆ์ฃผ์น  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ธˆ ๋” ๋ณต์žกํ•œ ์ œ์–ด ๊ธฐ์ˆ ๋“ค๋„ ์•Œ์•„๋‘๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฐœ๋… ์„ค๋ช…
๋ถ„์‚ฐ ๋ฝ (Redlock) ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ๋™์‹œ ๋‹ค๋ฐœ์ ์ธ ์ ‘๊ทผ์ด ๊ผฌ์ด์ง€ ์•Š๊ฒŒ ์ž๋ฌผ์‡ ๋กœ ์ œ์–ด
Transaction ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋ฅผ ๋ฌถ์–ด์„œ ํ•œ ๋ฒˆ์— ์‹คํ–‰ (๋‹จ, ์ผ๋ฐ˜ DB์™€ ๋‹ฌ๋ฆฌ ์‹คํŒจ ์‹œ ๋กค๋ฐฑ์€ ์—†์Œ)
Lua ์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด ๋ถ„๊ธฐ๊ฐ€ ํฌํ•จ๋œ ๋ณต์žกํ•œ ๋กœ์ง์„ Redis ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ๊ณ ์†์œผ๋กœ ์‹คํ–‰