2 ๋ถ„ ์†Œ์š”

Redis? ๐Ÿ’ฏ

Redis : Remote Dictionary Server์˜ ์•ฝ์ž๋กœ์„œ, "key-value" ๊ตฌ์กฐ์˜ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด๋‹ค.

โ€œkey-valueโ€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์ด๋ฏ€๋กœ NoSQL์ด๋ฉฐ, In-memory ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ์ €์žฅ์„ ์ œ๊ณตํ•˜์—ฌ ์†๋„๊ฐ€ ๋น ๋ฅด์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ๊บผ์ง€๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

์ด๋Ÿฐ ํŠน์ง•์œผ๋กœ ์ธํ•ด์„œ Redis๋Š” ์ „์ฒด ์„œ๋น„์Šค์—์„œ ์†๋„ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋ณด์กฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ๋ณดํŽธ์ ์ด๋‹ค.

์ถ”๊ฐ€์ ์ธ ํŠน์ง•์œผ๋กœ๋Š” ๋ฐ์ดํ„ฐ์— ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ง€์ •๋œ ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” Redis์—์„œ ์‚ญ์ œ๋˜๋ฉฐ, ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฝ‰ ์ฐผ์„๋•Œ๋„ LRU(Least recently used) ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

๊ทธ๋ž˜์„œ Redis๋Š” static page๋ฅผ ์บ์‹ฑํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜๋Š”๋ฐ ์ฃผ๋กœ ๋งŽ์ด ํ™œ์šฉ๋œ๋‹ค.

Cache : ์ปดํ“จํ„ฐ(server)์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ
  • DISK

  • Memory

  • L3 cache

  • L2 cache

  • L1 cache

  • core

์œ—์ชฝ์ผ์ˆ˜๋ก ์ €์žฅ์šฉ๋Ÿ‰์ด ํฌ๊ณ  ์•„๋žซ์ชฝ์ผ์ˆ˜๋ก ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค

SSD๋ฅผ ์“ด๋‹ค๊ณ ํ•˜๋”๋ผ๋„ DISK์™€ Memory์˜ ์†๋„์ฐจ์ด๋Š” ํฌ๋‹ค.

์ถ”์ƒ์ ์ธ ์›น์„œ๋น„์Šค ๊ตฌ์กฐ


Client -> Server -> DB


์‚ฌ์‹ค DB์—๋„ cache๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๊ฐ€์ง€์˜ ์ ‘๊ทผ์„ ํ•˜๊ฒŒ๋œ๋‹ค๋ฉด ๊ฒฐ๊ตญ disk์ ‘๊ทผ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•œ๋‹ค.

  1. Read-Through ( Lazy-loding )
  • Cache miss : ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญํ–ˆ์„๋•Œ ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ ํ›„ ์—†๋‹ค๋ฉด DB์— ์š”์ฒญ -> ์บ์‹œ์— ์ €์žฅ

  • Cache hit : ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œ์— ์žˆ๋Š”๊ฒƒ์„ ํ™•์ธ ํ›„ ๊ณง ๋ฐ”๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•จ

( ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ๋ณ€ํ•˜์ง€์•Š๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ )

  1. Write-Through
  • ์š”์ฒญ๋‚ด์—ญ์— ๋งž๊ฒŒ Cache์—…๋ฐ์ดํŠธ ์งํ›„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ƒ„๊ณผ ๋™์‹œ์— DB์— ์—…๋ฐ์ดํŠธํ•จ

( ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ )




redis ์‚ฌ์šฉ์ฒ˜

  • remote data store

    • A,B,C์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์„๋•Œ
  • ํ•œ๋Œ€์—์„œ๋งŒ ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด, ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์จ๋„ ๋ ๊บผ๊ฐ™์€๋ฐ?

    • redis ์ž์ฒด๊ฐ€ atomic์„ ๋ณด์žฅํ•ด์ค€๋‹ค ( ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด๊ธฐ๋•Œ๋ฌธ )
  • ์ฃผ๋กœ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ณณ

    • ์ธ์ฆํ† ํฐ( string, hash )
    • ๋žญํ‚น๋ณด๋“œ( sorted set )
    • ์œ ์ € API limit
    • ์žกํ list




redis collections

  • strings : key , value ( set, get, mset, mget )

  • list : ์ž๋ฃŒ๊ตฌ์กฐ ( ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž…์‹œ๋Š” ๋Š๋ ค์„œ ์‚ฌ์šฉ x ), (lpush, rpush, lpop, rpop )

  • set : ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด ( SADD, SMEMBERS, SISMEMBER )

  • sorted set : set์— score๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์ˆœ์„œ๋ฅผ ๋ณด์žฅ ( ZADD, ZRANGE )

  • hash : key ๋ฐ‘์— sub key๊ฐ€ ์กด์žฌ ( hmset, hgetall, hget, hmget )

ํ•˜๋‚˜์˜ collections์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์•„์ดํ…œ์„ ๋‹ด์œผ๋ฉด ์ข‹์ง€ ์•Š๋‹ค.(10000๊ฐœ ์ดํ•˜๊ฐ€ ์ข‹์Œ)




redis ์šด์˜

  • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ž˜ํ•˜์ž

redis๋Š” in-memory data store์ด๋‹ค.

physical memory ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ (swap์ด ์žˆ๋‹คํ•ด๋„ ๋Š๋ฆผ)

๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™”๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.(ex. 4GB๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ ์‚ฌ์‹ค์€ 5GB๋ฅผ ์“ฐ๊ณ ์žˆ์„๋•Œ)

์ด 64GB์ธ redis๋ผ๋ฉด 1๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.

RSS ๊ฐ’์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•ด์•ผํ•จ

  • O(N) ๊ด€๋ จ ๋ช…๋ น์–ด๋Š” ์ฃผ์˜ํ•˜์ž.

keys ๊ฐ™์€ ๋ช…๋ น์–ด๋Š” ์“ฐ์ง€๋ง์ž




์‹ค์Šตํ•˜๊ธฐ

Docker๋กœ redis๋ฅผ ๋„์šฐ๊ณ  ๋˜ ๋‹ค๋ฅธ Docker์— nodejs๋ฅผ ๋„์›Œ ์„œ๋กœ ์—ฐ๊ฒฐ์‹œ์ผœ๋ณด์ž.

sudo docker run --name video --network redis-net -d -p 8000:8000 video

sudo docker run --name redis --network redis-net -d -p 6379:6379 redis


redis-6



redis-7


(network-bridge๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ์—ˆ๋‹ค.)

const connectRedisServer = async () => {
  const client = redis.createClient({
    host: 'redis',
    port: 6379,
  });

  client.on('error', () => {
    throw new Error('connected error');
  });

  await client.connect();

  return client;
};

video์ปจํ…Œ์ด๋„ˆ์— ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š” nodejs์— redis๋ฅผ ์—ฐ๊ฒฐํ•˜์˜€๋‹ค.

์ฝ”๋“œ๋Š” ์•„๋ž˜ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

https://docs.redis.com/latest/rs/references/client_references/client_nodejs/

๊ทธ๋Ÿฐ๋ฐ ์—ฐ๊ฒฐ์ด๋˜์ง€์•Š์•˜๋‹ค.

๋ถ„๋ช… ๋กœ์ปฌ๋กœ ๋Œ๋ ธ์„๋•Œ๋Š” ์ž˜๋˜์—ˆ๋Š”๋ฐโ€ฆ

์ฒ˜์Œํ•ด๋ณด๋Š”๊ฑฐ๋ผ ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ์ง€ ๊ตฌ๊ธ€๋ง์„ํ–ˆ๋‹ค.

redis ๋ฐ”์ธ๋”ฉ์ด ์•ˆ๋œ๊ฑด๊ฐ€?

network bridge๋กœ๋Š” ์—ฐ๊ฒฐ์ด ์•ˆ๋˜๋Š”๊ฑด๊ฐ€?

ํฌํŠธํฌ์›Œ๋”ฉ์ด ์•ˆ๋œ๊ฑด๊ฐ€?

์ •๋ง ์˜ค๋žซ๋™์•ˆ ๊ณ ๋ฏผํ•˜์˜€๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์‹œ๋„๋ฅผ ํ•ด๋ณด์•˜๋‹ค.

๊ทธ๋Ÿฌ๋‹ค ๋งˆ์ง€๋ง‰์—๋Š” ์• ์ดˆ์— ์•ˆ๋˜๋Š”๊ฑธ ํ•˜๊ณ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๋๊นŒ์ง€ํ•˜๋ฉด ๋ฌด์กฐ๊ฑด์„ฑ๊ณตํ•œ๋‹ค๋Š” ๋‚˜์˜ ์„ฑ๊ณต๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ณ„์† ๋ฌผ๊ณ  ๋Š˜์–ด์กŒ๋‹ค.

๊ฒฐ๊ตญ์—๋Š” ์ฐพ์•˜๋Š”๋ฐ ์ •๋ง ์–ด์ด๊ฐ€ ์—†์—ˆ๋‹ค.

const connectRedisServer = async () => {
  const client = redis.createClient({
    host: '์•„๋ฌด๋ ‡๊ฒŒ๋‚˜์จ์ค˜๋„?',
    port: 47293329,
  });

๊ณตํ™ˆ์—์„œ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ๋ผ์„œ ๋ฏฟ์—ˆ๊ฑด๋งŒ ์•„๋ฌด๋ ‡๊ฒŒ ์จ์ค˜๋„ ๋กœ์ปฌ์—์„œ๋Š” ์—ฐ๊ฒฐ์ด ๋˜๋Š”๊ฒƒ์ด์—ˆ๋‹ค.

์ด๋ถ€๋ถ„์„ ์ฐพ์•„๋ณด์•˜๋”๋‹ˆ ์•„๋ž˜์˜ ์‚ฌ์ดํŠธ์—์„œ๋Š” url๋กœ ํ‘œ๊ธฐ๋ฅผ ํ•˜์˜€๋‹ค.

https://redis.js.org/

createClient({
  url: 'redis://alice:foobared@awesome.redis.server:6380'
});

redis[s]://[[username][:password]@][host][:port][/db-number].

์ด๊ฒƒ์„ ๋‚ด์ฝ”๋“œ์— ์ ์šฉ์‹œ์ผฐ๋‹ค.

const connectRedisServer = async () => {
  const client = redis.createClient({
    url: 'redis://@redis:6379',
  });

๋ฐ”๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ๋‹คโ€ฆ

์œ„ ์‚ฌ์ดํŠธ ๋‘˜๋‹ค npm install redis์„ ํ†ตํ•ด createClient๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ธ๋ฐ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ๋‹ฌ๋ž๋‹ค.

๋ฒ„์ „ ๋˜ํ•œ ๊ฐ™์•˜๋‹ค.


redis-13


๊ทธ๋ž˜์„œ createClient๋ฅผ ์ •์˜๋ณด๊ธฐ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๋‹ˆ ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด url์„ ์˜ต์…˜์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

ํ‰์†Œ ์ •์˜๋ณด๊ธฐ๋ฅผ ํ™œ์šฉํ•˜์ง€์•Š๊ณ  ๋ด๋„ ๋ฌด์Šจ๋œป์ธ์ง€ ๋ชฐ๋ผ ๋’ท๋ฐฉ ์ทจ๊ธ‰์„ ํ•˜์˜€๋Š”๋ฐ

์ด๋ฒˆ ์ผ์„ ๊ณ„๊ธฐ๋กœ ์ œ๋Œ€๋กœ ์•Œ์•„๋ณด์•„์•ผํ•  ๋‚˜์˜ ์ฒดํฌ์ˆœ์œ„์— ๋“ค์–ด๊ฐ€๊ฒŒ๋˜์—ˆ๋‹ค.

์ข‹์€ ๊ฒฝํ—˜์ด์—ˆ๋‹ค.!

์—…๋ฐ์ดํŠธ: