๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT

Redis: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์บ์‹ฑ์˜ ํ˜์‹ 

by ๐Ÿ’ฒ๐ŸŽตโœ–๏ธโœ”๏ธโ˜ผ 2024. 3. 5.
728x90

Redis: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์บ์‹ฑ์˜ ํ˜์‹ 

์†Œ๊ฐœ

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

Redis์˜ ์—ญํ• 

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: ์ฃผ๋กœ ์ธ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋†’์€ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  2. ์บ์‹œ: ๋ฐ์ดํ„ฐ ์บ์‹ฑ์— ๋งŽ์ด ์‚ฌ์šฉ๋˜์–ด ๋น ๋ฅธ ์‘๋‹ต์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค: Publish-Subscribe ํŒจํ„ด์„ ์ง€์›ํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ํ†ต์‹ ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Redis์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  1. ๋†’์€ ์„ฑ๋Šฅ: ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋””์Šคํฌ์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋น ๋ฅธ ์‘๋‹ต ์‹œ๊ฐ„์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ง€์›: ๋ฌธ์ž์—ด, ํ•ด์‹œ, ๋ฆฌ์ŠคํŠธ, ์…‹, ์ •๋ ฌ๋œ ์ง‘ํ•ฉ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•˜์—ฌ ์œ ์—ฐํ•œ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  3. ์˜คํ”ˆ ์†Œ์Šค ๋ฐ ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ: ์˜คํ”ˆ ์†Œ์Šค๋กœ ๊ฐœ๋ฐœ๋˜์–ด ์žˆ์–ด ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ „์„ธ๊ณ„์ ์œผ๋กœ ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ 

  1. ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ: ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ: ๋ฉ€ํ‹ฐ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๋ฉฐ, ํŠน์ • ์ƒํ™ฉ์—์„œ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Redis์˜ ์˜ˆ์ œ ์ฝ”๋“œ

  1. ๋ฌธ์ž์—ด ์ €์žฅ ๋ฐ ์กฐํšŒ:

     SET key1 "Hello, Redis!"
     GET key1
  2. ํ•ด์‹œ ์‚ฌ์šฉ:

     HSET user:1 username "john_doe"
     HGET user:1 username
  3. ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ:

     LPUSH mylist "item1"
     LPUSH mylist "item2"
     LRANGE mylist 0 -1
  4. ์บ์‹ฑ ํ™œ์šฉ:

     import redis
    
     r = redis.StrictRedis(host='localhost', port=6379, db=0)
     key = 'cached_data'
    
     if not r.exists(key):
         # ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑ
         data = fetch_data_from_database()
         r.set(key, data)
         r.expire(key, 3600)  # 1์‹œ๊ฐ„ ๋™์•ˆ ์œ ์ง€
    
     # ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
     cached_data = r.get(key)
  5. Pub-Sub ํŒจํ„ด:

     import redis
     import threading
    
     def subscriber():
         r = redis.StrictRedis(host='localhost', port=6379, db=0)
         p = r.pubsub()
         p.subscribe('channel')
    
         for message in p.listen():
             print('Received:', message['data'])
    
     def publisher():
         r = redis.StrictRedis(host='localhost', port=6379, db=0)
         r.publish('channel', 'Hello, subscribers!')
    
     # ๊ตฌ๋…์ž ์Šค๋ ˆ๋“œ ์‹œ์ž‘
     sub_thread = threading.Thread(target=subscriber)
     sub_thread.start()
    
     # ๋ฐœํ–‰์ž ์‹คํ–‰
     publisher()

์—ฐ๊ด€๋œ ๊ธฐ์ˆ 

  1. Redis Sentinel: Redis์˜ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

  2. Redis Cluster: ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ๋กœ, ๊ณ ๊ฐ€์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  3. Memcached: Redis์™€ ์œ ์‚ฌ

ํ•˜๊ฒŒ ์ธ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ํ‚ค-๊ฐ’ ์ €์žฅ ์‹œ์Šคํ…œ์œผ๋กœ, ์ฃผ๋กœ ๋ถ„์‚ฐ ์บ์‹ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  1. Spring Data Redis: Spring ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ Redis์™€์˜ ํ†ตํ•ฉ์„ ์ง€์›ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

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

๋Œ“๊ธ€