Redis

์™œ ๊ถ๊ธˆํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๊ฐ€?

  • ๋‹น๊ทผ๋งˆ์ผ“ python ์›น/์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์š”๊ตฌํ•˜๋Š” ๊ธฐ์ˆ ์—์„œ ๋ด„ https://boards.greenhouse.io/daangn/jobs/4300805003

    • ์ด๋Ÿฐ ์ผ์„ ํ•ด์š”

      • ๋จธ์‹ ๋Ÿฌ๋‹ ์–ด๋“œ๋ฏผ ์›น/์„œ๋ฒ„ ๊ฐœ๋ฐœ

      • ๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ๋Šฅ์„ ์›น์—์„œ ํ…Œ์ŠคํŠธ ํ™•์ธ

      • ๋ฐ์ดํ„ฐ ํƒ์ƒ‰/์ˆ˜์ง‘ UI

      • ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ

      • ๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ๋Šฅ ๋‚ด๋ถ€ API ๊ฐœ๋ฐœ

    • ์ด๋Ÿฐ ๋ถ„์„ ์ฐพ์•„์š”

      • Python, SQL ์–ธ์–ด์— ๋Šฅ์ˆ™ํ•œ ๋ถ„

      • CSS, Javascript ์›น ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

      • Redis, memcache๋ฅผ ํ™œ์šฉํ•œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

      • ๋น„๋™๊ธฐ ์ž‘์—… ๊ฐœ๋ฐœ ๊ฒฝํ—˜ (์˜ˆ: Celery)

      • gRPC / REST API ๊ตฌํ˜„ ๋Šฅ๋ ฅ

    • ๋”ฅ๋Ÿฌ๋‹์— ๋Œ€ํ•œ ์ดํ•ด ์ด๋Ÿฐ ๋ถ„์ด๋ผ๋ฉด ๋” ์ข‹์•„์š”!

      • ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ์‚ฌ์šฉ์ž ์„œ๋น„์Šค์— ์ ์šฉ

Redis๋ž€? (REmote Dictionary Server)

  • Remote์— ์œ„์น˜ํ•œ

  • ํ”„๋กœ์„ธ์Šค๋กœ ์กด์žฌํ•˜๋Š”

  • In-Memory ๊ธฐ๋ฐ˜์˜ : ๋ณดํ†ต ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผํ•˜๋ฉด์„œ RDBMS์˜ ์บ์‹œ ์†”๋ฃจ์…˜์œผ๋กœ ์‚ฌ์šฉ๋จ(RDBMS์˜ read ๋ถ€ํ•˜ ์ค„์ž„)

  • "ํ‚ค-๊ฐ’" ๊ตฌ์กฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ : ๋น„๊ด€๊ณ„ํ˜•์ด๋ฉฐ, ํ‚ค-๊ฐ’ ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„ ์ฟผ๋ฆฌ ์—†์–ด๋„ ๊ฐ„๋‹จํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ์ˆ˜ ์žˆ๋‹ค.(NoSQL)

Memcached์™€์˜ ์ฐจ์ด(๊ฑฐ์˜ ์œ ์‚ฌํ•จ)

  • Memcached์˜ ํŠน์ง•

    • ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค - ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ €์žฅ๋˜๋ฏ€๋กœ ๋น ๋ฅด๋‹ค. ์ฆ‰, ์†๋„๊ฐ€ ๋Š๋ฆฐ Disk๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค

    • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ €์žฅ๋œ๋‹ค.

      • ๋‹น์—ฐํžˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ๊ฑฐ๋‚˜ ์žฅ๋น„๊ฐ€ shutdown๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค

    • ๋งŒ๋ฃŒ์ผ์„ ์ง€์ •ํ•˜์—ฌ ๋งŒ๋ฃŒ๊ฐ€ ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

      • ์ด๋ฆ„์—์„œ๋„ ๋Š๊ปด์ง€๋“ฏ์ด cached์ด๋‹ค.

    • ์ €์žฅ์†Œ ๋ฉ”๋ชจ๋ฆฌ ์žฌ์‚ฌ์šฉ

      • ๋งŒ๋ฃŒ๊ฐ€ ๋˜์ง€ ์•Š๋”๋ผ๋„ ๋” ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด LRU(Least recently used) ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

        • LRU : ๊ฐ€์žฅ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ์‚ญ์ œ

Memcached
REDIS

์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. - ๋‹น์—ฐํžˆ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ €์žฅ๋˜๋ฏ€๋กœ ๋น ๋ฅด๋‹ค. ์ฆ‰, ์†๋„๊ฐ€ ๋Š๋ฆฐ Disk๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค.

์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. - ๋‹น์—ฐํžˆ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ+Disk์— ์ €์žฅ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์†๋„๋Š” Memcached์™€ ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ €์žฅ๋œ๋‹ค. - ๋‹น์—ฐํžˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ๊ฑฐ๋‚˜ ์žฅ๋น„๊ฐ€ Shutdown๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ+Disk์— ์ €์žฅ๋œ๋‹ค. - ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ๊ฑฐ๋‚˜ ์žฅ๋น„๊ฐ€ Shutdown๋˜๋”๋ผ๋„ Data์˜ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋งŒ๋ฃŒ์ผ์„ ์ง€์ •ํ•˜์—ฌ ๋งŒ๋ฃŒ๊ฐ€ ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. - ์ด๋ฆ„์—์„œ๋„ ๋Š๊ปด์ง€๋“ฏ์ด Cache์ด๋‹ค

๋งŒ๋ฃŒ์ผ์„ ์ง€์ •ํ•˜์—ฌ ๋งŒ๋ฃŒ๊ฐ€ ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. - ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค.

์ €์žฅ์†Œ ๋ฉ”๋ชจ๋ฆฌ ์žฌ์‚ฌ์šฉ - ๋งŒ๋ฃŒ๊ฐ€ ๋˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๋”์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉดLRU(Least recently used) ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

์ €์žฅ์†Œ ๋ฉ”๋ชจ๋ฆฌ ์žฌ์‚ฌ์šฉ ํ•˜์ง€ ์•Š๋Š”๋‹ค. - ๋ช…์‹œ์ ์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ž์—ด๋งŒ ์ง€์›

๋ฌธ์ž์—ด, Set, Sorted Set, Hash, List๋“ฑ์˜ ๋‹ค์–‘ํ•œ Data Type์„ ์ง€์›.

Redis์˜ ํŠน์ง•

key-value store

๋ ˆ๋””์Šค๋Š” ๊ฑฐ๋Œ€ํ•œ ๋งต(Map) ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. Key์™€ value๊ฐ€ ๋งคํ•‘๋œ ๋‹จ์ˆœํ•œ ๋งต ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋กœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ ˆ๋””์Šค์— ์‰ฝ๊ณ  ํŽธํ•˜๊ฒŒ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฅ์ ์€ ์ตํžˆ๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ ์ธ ๋ฐ ์žˆ๊ณ  ๋‹จ์ ์€ Key-value ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ ˆ๋””์Šค ์ž์ฒด๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…

Key๋กœ ์ฐธ์กฐ๋˜๋Š” Value ํƒ€์ž…์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ง€์ •ํ•˜์—ฌ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. List, String, Set, Sorted set ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์ •ํ•˜์—ฌ ์†์‰ฝ๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. String

    • ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ž์—ด๋กœ ์ตœ๋Œ€ 512mbyte ๊ธธ์ด๊นŒ์ง€ ์ง€์›ํ•œ๋‹ค. Text ๋ฌธ์ž์—ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Integer์™€ ๊ฐ™์€ ์ˆซ์ž๋‚˜ JPEG ๊ฐ™์€ Binary File๊นŒ์ง€ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. Set

    • set์€ String์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ํ•˜๋‚˜์˜ Value ๋‚ด์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๋ฉฐ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ์˜ ํƒœ๊ทธ(Tag) ๋“ฑ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์žฌ๋ฏธ์žˆ๋Š” ์ ์€ set ๊ฐ„์˜ ์—ฐ์‚ฐ์„ ์ง€์›ํ•˜๋Š”๋ฐ, ์ง‘ํ•ฉ์ธ ๋งŒํผ ๊ต์ง‘ํ•ฉ, ํ•ฉ์ง‘ํ•ฉ, ์ฐจ์ด(Differences)๋ฅผ ๋งค์šฐ ๋น ๋ฅธ ์‹œ๊ฐ„ ๋‚ด์— ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์ €์žฅํ•˜๋ฉด ์ตœ์ข… ํ•œ๋ฒˆ๋งŒ ์ €์žฅ๋œ๋‹ค. ์ด๊ฑธ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ ๋‹ค ๊ฐ–๊ณ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์ด ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  1. Sorted Set

    • set์— โ€œscoreโ€๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ ํ˜•์œผ๋กœ score๋Š” ์ผ์ข…์˜ โ€œ๊ฐ€์ค‘์น˜โ€ ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. sorted set์—์„œ ๋ฐ์ดํ„ฐ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋‚ด๋ถ€ ์ •๋ ฌ๋˜๋ฉฐ, ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ๋งŒํผ score ๊ฐ’ ๋ฒ”์œ„์— ๋”ฐ๋ฅธ ์ฟผ๋ฆฌ, top Rank์— ๋”ฐ๋ฅธ query ๋“ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  2. Hashes

    • hash๋Š” value ๋‚ด์— field/string value ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ…Œ์ด๋ธ”์„ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํƒ€ ๊ตฌ์กฐ์ฒด์ด๋‹ค. RDBMS์—์„œ PK 1๊ฐœ์™€ string ํ•„๋“œ ํ•˜๋‚˜๋กœ ์ด๋ฃจ์–ด์ง„ ํ…Œ์ด๋ธ”์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

  3. List

    • list๋Š” string๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋Š” set๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ผ์ข…์˜ ์–‘๋ฐฉํ–ฅ Linked list๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. List ์•ž๊ณผ ๋’ค์—์„œ PUSH/POP ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜ ์žˆ๊ณ , ์ง€์ •๋œ Index๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์ง€์ •๋œ ์œ„์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜ ์žˆ๋‹ค.

Persistence(Disk์— ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜๋ฉด์„œ ์ƒ๊ธด ์˜์†์„ฑ)

Redis๋Š” ๋ฐ์ดํ„ฐ๋ฅผ disk์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Redis๋Š” ์„œ๋ฒ„๊ฐ€ shutdown๋œ ํ›„์— restart ํ•˜๋”๋ผ๋„ disk์— ์ €์žฅํ•ด๋†“์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฝ์–ด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. redis์˜ ๋ฐ์ดํ„ฐ๋ฅผ disk์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์€ snapshot, AOF ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Snapshot : ์Šค๋ƒ…์ƒท์€ RDB์—์„œ๋„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์–ด๋–ค ํŠน์ • ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ DISK์— ์˜ฎ๊ฒจ๋‹ด๋Š” ๋ฐฉ์‹์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. Blocking ๋ฐฉ์‹์˜ SAVE์™€ Non-blocking ๋ฐฉ์‹์˜ BGSAVE ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • AOF : Redis์˜ ๋ชจ๋“  write/update ์—ฐ์‚ฐ ์ž์ฒด๋ฅผ ๋ชจ๋‘ log ํŒŒ์ผ์— ๊ธฐ๋กํ•˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์žฌ์‹œ์ž‘ํ•  ์‹œ write/update๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์žฌ์‹คํ–‰, ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค.

๋ ˆ๋””์Šค ๊ณต์‹๋ฌธ์„œ์—์„œ์˜ ๊ถŒ์žฅ์‚ฌํ•ญ์€ RDBMS์˜ rollback ์‹œ์Šคํ…œ๊ฐ™์ด ๋‘ ๋ฐฉ์‹์„ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ๊ธฐ์ ์œผ๋กœ snapshot์œผ๋กœ ๋ฒก์—…ํ•˜๊ณ  ๋‹ค์Œ snapshot๊นŒ์ง€์˜ ์ €์žฅ์„ AOF ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด cache ๋กœ ์“ฐ์ผ ๋•Œ๋Š” ์–ธ์ œ?

์„œ๋น„์Šค ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ๊ฐ€ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ์œ ์ €์˜ ์š”์ฒญ์„ DB ์ ‘๊ทผ์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด DB ์„œ๋ฒ„์— ๋ฌด๋ฆฌ๊ฐ€ ๊ฐˆ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ๋ฌผ๋ก  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์˜ ์žฅ์• ์™€๋Š” ๋ณ„๊ฐœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์š”์ฒญ์ด ์ฆ๊ฐ€ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ๊ธฐ์กด ์„ฑ๋Šฅ์„ ๊ธฐ๋Œ€ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.

์ด๋Ÿฐ ๋งฅ๋ฝ์—์„œ ์บ์‹œ๋Š” ๋‚˜์ค‘์— ์š”์ฒญ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ๋นจ๋ฆฌ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ๋ณดํ†ต ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Redis Cache ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‹จ (In-Memory) ์— ์œ„์น˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋””์Šคํฌ๋ณด๋‹ค ์ˆ˜์šฉ๋ ฅ(์šฉ๋Ÿ‰) ์€ ์ ์ง€๋งŒ ์ ‘๊ทผ ์†๋„๋Š” ๋น ๋ฅด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์บ์‹œ๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ?

  • ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด : Look aside cache

    ์ฒ˜๋ฆฌ์ˆœ์„œ

    1.  ์›น ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐ›์•„์„œ, ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์บ์‹œ๋ฅผ **๋จผ์ €** ํ™•์ธ

    2. Cache์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฑธ ๊บผ๋‚ด์ฃผ๋Š”๋ฐ, ๋งŒ์•ฝ ์—†์œผ๋ฉด 3. DB์—์„œ ์ฝ์–ด์„œ -> ๋จผ์ € ์บ์‹œ์— ์ €์žฅํ•œ๋‹ค์Œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ๋ ค์คŒ

  • Write Back

    ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ์— ์ „๋ถ€ ์ €์žฅํ•ด๋†“์•˜๋‹ค๊ฐ€ ํŠน์ • ์‹œ์ ๋งˆ๋‹ค ํ•œ๋ฒˆ์‹ ์บ์‹œ ๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ DB์— insertํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

    insert๋ฅผ 1๊ฐœ์”ฉ 500๋ฒˆ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค 500๊ฐœ๋ฅผ ํ•œ๋ฒˆ์— ์‚ฝ์ž…ํ•˜๋Š” ๋™์ž‘์ด ํ›จ์”ฌ ๋น ๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, write back๋ฐฉ์‹๋„ ์„ฑ๋Šฅ๋ฉด์—์„œ ๋’ค์ณ์ง€๋Š” ๋ฐฉ์‹์€ ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด์จ‹๋“  ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ • ๊ธฐ๊ฐ„๋™์•ˆ์€ ์œ ์ง€ํ•˜๊ณ  ์žˆ์–ด์•ผํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ด๊ฑธ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š” storage๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๋ฏ€๋กœ ์„œ๋ฒ„ ์žฅ์•  ์ƒํ™ฉ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์‹œ ์žฌ์ƒ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ๊ทน๋‹จ์ ์œผ๋กœ heavyํ•œ ๋ฐ์ดํ„ฐ์—์„œ write back๋ฐฉ์‹์„ ๋งŽ์ด ์‚ฌ์šฉใ…Ž๋‚˜๋‹ค.

ANIS C ๋กœ ์ž‘์„ฑ

C์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด Java์™€ ๊ฐ™์ด ๊ฐ€์ƒ๋จธ์‹  ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์–ธ์–ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž์œ ๋กญ์Šต๋‹ˆ๋‹ค. ๊ณง๋ฐ”๋กœ ๊ธฐ๊ณ„์–ด๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๊ณ  ์–ด๋–ค ๊ฐ€์ƒ์˜ ๋จธ์‹  ์œ„์—์„œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋œ ์–ธ์–ด๋กœ ๊ฐ€๋™ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection) ๋™์ž‘์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ C์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ Redis๋Š” ์ด๋Ÿฐ ์ด์Šˆ์—์„œ ์ž์œ ๋กญ๋‹ค.

์„œ๋ฒ„ ์ธก ๋ณต์ œ ๋ฐ ์ƒค๋”ฉ์„ ์ง€์›

  • ์ฝ๊ธฐ ์„ฑ๋Šฅ ์ฆ๋Œ€๋ฅผ ์œ„ํ•œ ์„œ๋ฒ„ ์ธก ๋ณต์ œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • ์“ฐ๊ธฐ ์„ฑ๋Šฅ ์ฆ๋Œ€๋ฅผ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ์ธก ์ƒค๋”ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

    • ์ƒค๋”ฉ : "์กฐ๊ฐ๋‚ด๋‹ค"๋ผ๋Š” ๋œป์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ์ „์ฒด ๋„คํŠธ์›Œํฌ๋ฅผ ๋ถ„ํ• ํ•œ ๋’ค ํŠธ๋žœ์žญ์…˜์„ ์˜์—ญ๋ณ„๋กœ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ธ”๋ก์ฒด์ธ์— ํ™•์žฅ์„ฑ์„ ๋ถ€์—ฌํ•˜๋Š” ์˜จ์ฒด์ธ ์†”๋ฃจ์…˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒค๋“œ๋ผ๋Š” ๋‹จ์œ„๋กœ ๋‚˜๋ˆ ์„œ ์ €์žฅ ๋ฐ ์ฒ˜๋ฆฌ

Atomic ํ•˜๋‹ค

  • ์นœ๊ตฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ key-value ํ˜•ํƒœ๋กœ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๋ฉด

    • ๊ฐ™์€ ์นœ๊ตฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฝ์€ ํ›„, ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฆฌ์ŠคํŠธ์— ์„œ๋กœ ๋‹ค๋ฅธ ์นœ๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

    • ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์นœ๊ตฌ ๋ฆฌ์ŠคํŠธ์˜ ์ตœ์ข… ์ƒํƒœ๋Š” -> ๋‘ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ถ”๊ฐ€ํ•œ ์‚ฌ๋žŒ A, B ๊ฐ€ ์ „๋ถ€ ๋ฐ˜์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

    • T1[์นœ๊ตฌ B ์ถ”๊ฐ€] -> T2[์นœ๊ตฌ C ์ถ”๊ฐ€] -> T1[B ์ถ”๊ฐ€ํ•œ๊ฑธ ์ตœ์ข…์ƒํƒœ์— ๋ฐ˜์˜(์“ฐ๊ธฐ)] -> T2[C ์ถ”๊ฐ€ํ•œ๊ฑธ ์ตœ์ข…์ƒํƒœ์— ๋ฐ˜์˜(์“ฐ๊ธฐ)]

      ๊ฐ ํŠธ๋žœ์ ์…˜์—์„œ๋Š” ์ด๋Ÿฐ ์ˆœ์„œ๋กœ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿผ ์šฐ์—ฐํ•œ ํƒ€์ด๋ฐ์— 3๋ฒˆ์งธ์™€ 4๋ฒˆ์งธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋˜๋ฉด์„œ ๋ฆฌ์ŠคํŠธ ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์ตœ์ข… ์ƒํƒœ์—์„œ๋„ ๊ฒฐ๊ตญ context switching ๋•Œ๋ฌธ์— T1 ๊ณผ T2 ๋‘˜ ์ค‘ ๋ญ๊ฐ€ ๋จผ์ € ๋ฐœ์ƒํ• ์ง€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์นœ๊ตฌ๋ฆฌ์ŠคํŠธ๊ฐ€ [A,B] or [A,C] ๋žœ๋ค์œผ๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋‹ค.

Redis ์ž๋ฃŒ๊ตฌ์กฐ๋Š” Atomic ํ•˜๋‹ค๋Š” ํŠน์ง• ๋•Œ๋ฌธ์— ์ด๋Ÿฐ race condition ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, Redis Transaction ์€ ํ•œ๋ฒˆ์˜ ๋”ฑ ํ•˜๋‚˜์˜ ๋ช…๋ น๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋”ํ•˜์—ฌ single-threaded ํŠน์„ฑ ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์Šคํ† ๋ฆฌ์ง€ ํ”Œ๋žซํผ๋ณด๋‹ค๋Š” ์ด์Šˆ๊ฐ€ ๋œํ•˜๋‹ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ํŠน์ง•์ด ๋”๋ธ”ํด๋ฆญ ๊ฐ™์€ ๋™์ž‘์œผ๋กœ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ 2๋ฒˆ์”ฉ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š” ๋ถˆ์ƒ์‚ฌ๋Š” ๋ง‰์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋”ฐ๋ผ์„œ ๋ ˆ๋””์Šค๋Š” remote data storage ๋กœ์„œ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋ณด๊ณ ์‹ถ์„ ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ธ์ฆ ํ† ํฐ์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์œ ์ € API limit ์„ ๋‘๋Š” ์ƒํ™ฉ ๋“ฑ์—์„œ ๋ ˆ๋””์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

Redis ์•„ํ‚คํ…์ณ

Redis Topology

๋ ˆ๋””์Šค๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด Master-slave ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•ด์„œ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด master-slave ๊ฐ„์˜ ๋ณต์ œ๋Š” non-blocking ์ƒํƒœ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

Redis Sharding

๋ ˆ๋””์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒค๋”ฉํ•˜์—ฌ ๋ ˆ๋””์Šค์˜ read์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋กœ๋“ค์–ด #1~#999, #1000~#1999 ID ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ๋ฐ์ดํ„ฐ์˜ ์šฉ๋Ÿ‰์„ ํ™•์žฅํ•˜๊ณ  ๊ฐ ์„œ๋ฒ„์— ์žˆ๋Š” Redis์˜ ๋ถ€ํ•˜๋ฅผ ๋‚˜๋ˆ„์–ด ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Redis Clustering

๋ ˆ๋””์Šค๋Š” ์ด์ „์—๋Š” Clustering์„ ์ง€์›ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ Clustering์„ ์ง€์›ํ•˜๋ฉด์„œ ๋Œ€๋ถ€๋ถ„์˜ ํšŒ์‚ฌ๊ฐ€ Redis๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ฌถ์–ด์„œ ๊ฐ€์šฉ์„ฑ ๋ฐ ์•ˆ์ •์„ฑ์žˆ๋Š” ์บ์‹œ ๋งค๋‹ˆ์ ธ๋กœ์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Single Instance๋กœ์„œ ๋ ˆ๋””์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” Sharding์ด๋‚˜ Topology๋กœ์„œ ์ปค๋ฒ„ํ•ด์•ผํ–ˆ๋˜ ๋ถ€๋ถ„์„ Clustering์„ ์ด์šฉํ•จ์œผ๋กœ์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ ์ข€ ๋” ์ˆ˜์›”ํ•ด์กŒ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Cluster ๋ž€

    ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์„œ๋ฒ„๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ

    Point - ํŠน์ • ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ์ผ์–ด๋‚˜๋”๋ผ๋„ ๋ฐฑ์—… ์„œ๋ฒ„์˜ ๋ณด์™„์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค์—†์ด ์„œ๋น„์Šค๋ฅผ ๊ณ„์† ์ด์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์Œ.

์ถœ์ฒ˜: https://velog.io/@swhan9404/Redis-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

Last updated