Redis
Redis? ๐ฏ
โkey-valueโ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ด๋ฏ๋ก NoSQL์ด๋ฉฐ, In-memory ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ์ ์ฅ์ ์ ๊ณตํ์ฌ ์๋๊ฐ ๋น ๋ฅด์ง๋ง ์๋ฒ๊ฐ ๊บผ์ง๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ค๋ ๋จ์ ์ด ์๋ค.
์ด๋ฐ ํน์ง์ผ๋ก ์ธํด์ Redis๋ ์ ์ฒด ์๋น์ค์์ ์๋ ํฅ์์ ์ํ ๋ณด์กฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ฌ์ฉ๋๋ ๊ฒ์ด ๋ณดํธ์ ์ด๋ค.
์ถ๊ฐ์ ์ธ ํน์ง์ผ๋ก๋ ๋ฐ์ดํฐ์ ๋ง๋ฃ์๊ฐ์ ์ง์ ํ ์ ์์ด์ ์ง์ ๋ ๋ง๋ฃ์๊ฐ์ด ์ง๋๋ฉด ํด๋น ๋ฐ์ดํฐ๋ Redis์์ ์ญ์ ๋๋ฉฐ, ๋ง๋ฃ๋์ง ์์์ง๋ง ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฝ ์ฐผ์๋๋ LRU(Least recently used) ์๊ณ ๋ฆฌ์ฆ์ ์ํด ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ค.
๊ทธ๋์ Redis๋ static page๋ฅผ ์บ์ฑํ๊ฑฐ๋ ๊ฒ์ ๋๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๋๋ฐ ์ฃผ๋ก ๋ง์ด ํ์ฉ๋๋ค.
-
DISK
-
Memory
-
L3 cache
-
L2 cache
-
L1 cache
-
core
์์ชฝ์ผ์๋ก ์ ์ฅ์ฉ๋์ด ํฌ๊ณ ์๋ซ์ชฝ์ผ์๋ก ์๋๊ฐ ๋น ๋ฅด๋ค
SSD๋ฅผ ์ด๋ค๊ณ ํ๋๋ผ๋ DISK์ Memory์ ์๋์ฐจ์ด๋ ํฌ๋ค.
์ถ์์ ์ธ ์น์๋น์ค ๊ตฌ์กฐ
Client -> Server -> DB
์ฌ์ค DB์๋ cache๊ฐ ์กด์ฌํ๋ค. ํ์ง๋ง ์ฌ๋ฌ๊ฐ์ง์ ์ ๊ทผ์ ํ๊ฒ๋๋ค๋ฉด ๊ฒฐ๊ตญ disk์ ๊ทผ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผํ๋ค.
- Read-Through ( Lazy-loding )
-
Cache miss : ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์ ์์ฒญํ์๋ ์บ์์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ํ์ธ ํ ์๋ค๋ฉด DB์ ์์ฒญ -> ์บ์์ ์ ์ฅ
-
Cache hit : ๋ฐ์ดํฐ๊ฐ ์บ์์ ์๋๊ฒ์ ํ์ธ ํ ๊ณง ๋ฐ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํจ
( ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ณํ์ง์๋ ๊ฒฝ์ฐ ์ฌ์ฉ )
- 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
(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๋ฅผ ์ฌ์ฉํ๋๊ฒ์ธ๋ฐ ์ฌ์ฉ๋ฐฉ๋ฒ์ด ๋ฌ๋๋ค.
๋ฒ์ ๋ํ ๊ฐ์๋ค.
๊ทธ๋์ createClient๋ฅผ ์ ์๋ณด๊ธฐ๋ฅผ ํตํด ์์๋ณด๋ ์ ์ฌ์ง๊ณผ ๊ฐ์ด url์ ์ต์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋๊ฒ์ ํ์ธํ๋ค.
ํ์ ์ ์๋ณด๊ธฐ๋ฅผ ํ์ฉํ์ง์๊ณ ๋ด๋ ๋ฌด์จ๋ป์ธ์ง ๋ชฐ๋ผ ๋ท๋ฐฉ ์ทจ๊ธ์ ํ์๋๋ฐ
์ด๋ฒ ์ผ์ ๊ณ๊ธฐ๋ก ์ ๋๋ก ์์๋ณด์์ผํ ๋์ ์ฒดํฌ์์์ ๋ค์ด๊ฐ๊ฒ๋์๋ค.
์ข์ ๊ฒฝํ์ด์๋ค.!