๐ฑ Redis๋ฅผ ๋์ ํด์ ์บ์ฑ ์์ ์ ์งํํด๋ณด์!!! [1ํ]
๐ค Intro
์ด๋ฒ์ ์ถ์ฒ ์์คํ ์ ๊ตฌ์ฑํ๋ฉด์ ์ถ์ฒ ์์คํ ์์์ ์ฌ์ฉํ ์ ์ ์ ๋ณด๋ฅผ ์บ์ฑํด๋๊ธฐ ์ํด memoryDB์ธ REDIS๋ฅผ ๋์ ํ๊ธฐ๋ก ํ์๋ค.
๊ทธ๋ฌ๋ ๋์ ๊ฒฝ์ฐ๋, REDIS์ ๊ฐ๋ ์ด๋ ์ฌ์ฉ ๋ฐฉ๋ฒ๋ง ์๊ณ ์ด๊ฒ์ ์ค์ ๋ก ์ฌ์ฉํด๋ณธ์ ์ ์๊ธฐ ๋๋ฌธ์โฆ.์ด๋ฒ ๊ธฐํ๋ฅผ ํตํด REDIS์ ๊ฐ์ฅ ๋ํ์ ์ธ ๊ธฐ๋ฅ์ธ โ์บ์ฑโ์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ณ ์ ํ๋ค.
REDIS๋ ํ์ฉ ๋ฐฉ๋ฒ์ด ์๋ ๋ง๊ณ ๊น๊ฒ ์ฐ์๋ฉด ๋ฅํ๊ฒ ์ฐ๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง, ์ฐ๋ฆฌ๋ ์๊ฐ์ด ์๊ณ ๋ฐ๋ก ํ๋ก์ ํธ์ ์ด๊ฒ์ ์ ์ฉํด์ผ ํ๋ ์ํฉ์ด๊ธฐ์,,, ๋ฑ ์บ์ฑ์ ์ด์ ์ ๋ง์ถฐ์ ์คํฐ๋๋ฅผ ์งํํด๋ณด๊ณ ์ ํ๋ค.
๐ฉถ Start
๋ ๋์ค๋ ๋ฌด์์ผ๊น?
๋ ๋์ค๋ ์คํ์์ค๋ก, key-value ๊ธฐ๋ฐ์ ์ธ-๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ์ ์ฅ์์ด๋ค. ๋ฐ๋ผ์ ๋ฐ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆด ํ์ ์์ด key๋ก ๊ฐ์ ์กฐํํ ์ ์๊ณ , ๋์คํฌ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๊ตฌ์กฐ๊ฐ ์๋, ๋ฉ๋ชจ๋ฆฌ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌDB ์ด๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค๋ ์ฅ์ ์ด ์๋ค.
๊ทธ๋์ ์ฃผ๋ก ์บ์ฑํ๋ ์ฉ๋๋ก ๋ง์ด ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ ๋์ค๋ฅผ ์บ์ฑ ์ฉ๋๋ก ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด, ์บ์ฑ๊ณผ DB๊ฐ ์ด๋ค ๊ด๊ณ์ฑ์ ๊ฐ์ง๋์ง๋ฅผ ๋จผ์ ์์์ผ ํ๋ค. ์ด๋ฅผ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
1. ์กฐํ ๋ก์ง (Look Aside Cache, Read Path)
์ด๋ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํ(์ฝ๊ธฐ)ํ ๋, ์ด๋ค ์์๋ก ๋์ํ๋๊ฐ๋ฅผ ๋งํ๋ค. ์์๋ฅผ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ค. ์ด๋ ์๋ฒ๋ ๋ฐ๋ก DB์ ์ ๊ทผํ๋ ๊ฒ์ด ์๋๋ผ ์บ์์ ๋จผ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง๋ฅผ ํ์ธํ๋ค.
์ฌ๊ธฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ๋ฐ๋ก ์บ์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์๋ตํ๋ค.
๋ฐ์ดํฐ๊ฐ ์บ์์ ์๋ค๋ฉด DB์์ ๋จผ์ ์กฐํํ ํ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์บ์์ ์ ์ฅํ ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค. ์ฆ, ์ด๋ ๊ฒ ํ ๋ฒ ์บ์์ ์ ์ฅ๋๊ณ ๋๋ฉด ๋ค์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด ์ธ ๋๋ ์บ์์์ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด ์ธ ์ ์๊ฒ ๋๋ค.
2. ์ ์ฅ ๋ก์ง
์ด๋ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ(์ฐ๊ธฐ) ํ ๋ ์ด๋ค ์์๋ก ๋์ํ๋์ง๋ฅผ ๋งํ๋ค. ์์๋ฅผ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ฐ์ดํฐ ์ ์ฅ์ ์์ฒญํ๋ค.
์ด๋, ์๋ฒ๋ ๋ฐ๋ก DB์ ์ ์ฅ์ ์์ฒญํ์ง ์๊ณ , ์ฐ์ ์บ์์ ๋จผ์ ์ ์ฅํ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ๋ค. ์ด๋ฅผ ํตํด ๋น ๋ฅธ ์๋ต์ด ๊ฐ๋ฅํ๋ค.
์ดํ ๋ณ๋์ Worker(๋น๋๊ธฐ ์ฒ๋ฆฌํ๋ค.)๊ฐ ์บ์์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ชจ์์ DB์ ์ ์ฅํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ์์ฒญ ๋ง๋ค ์ ์ฅํ๋๊ฒ ์๋๋ผ, DB์๋ ํ ๋ฒ์ ๋ฒํฌ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํด์ ๋ฐ์ดํฐ๋ฅผ INSERT ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ ์ ์๋ค.
Redis ์ค์นํ๊ธฐ
redis์ ๊ฒฝ์ฐ๋ CLI ๋ฐฉ์์ด ์๊ณ GUI ๋ฐฉ์์ผ๋ก ๋์๋ ๊ฐ๋ฅํ๋ค.
๋์ ๊ฒฝ์ฐ๋ ์๋ฌด๋๋ CLI ๋ฐฉ์์ด ๋ ํธํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ์์ผ๋ก ์งํํ๊ธฐ๋ก ํ์๋ค.
์ฐ์ Redis๋ฅผ ๋ก์ปฌ์ ์ค์นํด๋ณด์.
Run Redis Open Source on Windows using Docker
๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด, REDIS๋ฅผ window์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ docker๋ฅผ ์ฌ์ฉํด์ ๋์์ผ ํ๋ค๊ณ ํ๋ค. ๋ง๊ฐ์ ์ด์ฉํด์ ์ REDIS๋ฅผ window์์ ์ฌ์ฉํ๋ ค๋ฉด docker๋ฅผ ์ฌ์ฉํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์์๋ณด์.
REDIS๋ฅผ window์์ ์ฌ์ฉํ๋ ค๋ฉด ์ docker๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?
๊ณต์ REDIS๊ฐ ์๋์ฐ์ฉ ๋ค์ดํฐ๋ธ ๋น๋๋ฅผ ๋์ด์ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. Redis ์์ฒด๊ฐ ์ค๋ฒ์ปค๋ฐ ๋ฆฌ๋ ์ค ์ปค๋์ ๋ง์ ๋ถ๋ถ์ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๊ฒฐ๊ตญ docker๋ฅผ ์ด์ฉํด์ ์ปจํ ์ด๋๋ก ๋ฆฌ๋ ์ค ํ๊ฒฝ์ ํตํด Redis์ ์ ๊ทผํด์ผ ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๊ณต์ ๋ฌธ์์ ์๋๋๋ก, docker๋ฅผ ์ด์ฉํด์ REDIS๋ฅผ ๋์๋ณด๋๋ก ํ์.
Docker๋ฅผ ํตํด REDIS ๋์ฐ๊ธฐ
docker run -d --name redis -p 6379:6379 `
-v C:/developer/GitHub/5th__sinhhanDStudy/redis/redis-docker/redis.conf:/usr/local/etc/redis/redis.conf `
redis:7 `
redis-server /usr/local/etc/redis/redis.conf
์ด๋ฅผ ํตํด docker desktop์์ redis ์ต์ ๋ฒ์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํด์ ์ค์นํด์ค๋ค
docker exec redis redis-cli -a mySecret! PING # PONG ๋์ค๋ฉด ์ ์
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
PONG
์ฐธ๊ณ ๋ก, ๋น๋ฐ๋ฒํธ๊ฐ ์ ๋๋ก ์ค์ ๋์๋์ง ๋ณด๋ ค๋ฉด ๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
$ docker exec -it redis redis-cli
๋ค์ ๋ช ๋ น์ด๋ฅผ ํตํด docker container์์ redis-cli๋ฅผ ์คํํ๋ค.
$ docker exec -it redis redis-cli
127.0.0.1:6379>
์ด๋ ๊ฒ local ์๋ฒ์ redis๋ฅผ ์ํ port์ ์ฐ๊ฒฐ ๋์๋ค๋ฉด, ์ ์์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋ก, ๋น๋ฐ๋ฒํธ๊ฐ ์ ๋๋ก ์ค์ ๋์๋ค๊ณ ๋์จ๋ค๋ฉด ์ธํ ๋ฆฌ์ ์ด์ REDIS ์ฐ๋์ด ๊ฐ๋ฅํ๋ค.
๋ ๋์ค ๋์ปค ์ด๋ฏธ์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๋ถ์ ๋ด์ฅ๋ redis.conf (์ค์ ํ์ผ)์ ์ฌ์ฉํ๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ปค์คํ ์ค์ (์: ๋น๋ฐ๋ฒํธ ์ค์ , ํฌํธ ๋ณ๊ฒฝ, ์ต๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ ๋ฑ)์ ์ ์ฉํ๋ ค๋ฉด, ๋ด ์ค์ ํ์ผ(redis.conf) ์ ์ปจํ ์ด๋ ์์ผ๋ก ๊ฐ์ ธ์์ผํ๋ค.
ํนํ ๋์ ๊ฒฝ์ฐ๋, REDIS์ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ฑธ์ด๋๊ธฐ ๋๋ฌธ์, ๋ค์ ์ค์ ๊ฐ์ ๋ฃ์ด์ฃผ์๋ค. REDIS์ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ฑธ๊ณ ์ถ๋ค๋ฉด redis.conf์ ๋ค์ ๊ฐ์ ๋ฃ์ด์ค์ผ ํ๋ค.
requirepass ~~~~~
์ฐธ๊ณ ๋ก ๋น์ฐํ์ง๋ง, .conf ํ์ผ์๋ ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ์ค์ ๊ฐ๋ค์ด ๋ค์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ๋ github์ ์ฌ๋ ค์๋ ์๋๋ค.
redis.conf์ redis์ ํ์ํ ์ค์ ๊ฐ๋ค์ ๋ฃ์ด์คฌ๋ค๋ฉด, docker๋ก redis๋ฅผ ๋์ ๊ธฐ ๋๋ฌธ์ Dockerfile์ ์ด์ฉํด์ Docker ์ปจํ ์ด๋ ๋ด๋ถ์ ๊ฒฝ๋ก๋ก ๋ณต์ฌํด์ ์ค์ ๊ฐ์ ๋ฃ์ด์ค์ผ ํ๋ค.
๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ Dockerfile์ ์์ฑํด์ค๋ค.
1
2
3
FROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
๋ดํ๋ก์ ํธ/
โโโ Dockerfile
โโโ redis.conf โ ๋ด๊ฐ ๋ง๋ ์ค์ ํ์ผ (ํธ์คํธ์ ์์)
โโโ src/
๊ฒฐ๊ตญ, ์ด ์์น์ ์๋ conf ํ์ผ์ ๋ณต์ฌํด์ docker ํ๊ฒฝ์ ์ฃผ์ ํด์ฃผ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๊ฐ ์์ฑํ redis ์ค์ ํ์ผ์ docker ํ๊ฒฝ์ ์ฃผ์ ํด์, local๊ณผ ๊ฐ์ ํ๊ฒฝ์์ ํ์ฉ์ด ๊ฐ๋ฅํ๋ค.
$ docker exec -it redis redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
์ฐธ๊ณ ๋ก REDIS ์ฐ๊ฒฐ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
docker exec -it redis redis-cli๋ฅผ ํตํด REDIS์ CLI๋ก ์ ๊ทผํ๊ณ , PING์ ์ ๋ ฅํ๋ฉด PONG์ด ๋์ค๋ ์์ผ๋ก ์ฐ๊ฒฐ์ ํ์ธํ ์ ์๋ค.
ํค ๋ค์ด๋ฐ ๊ท์น
REDIS์ ๊ฒฝ์ฐ, DB์ฒ๋ผ ํ ์ด๋ธ์ด ์๋๊ฒ ์๋๋ผ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ Key-value์ธ NoSql์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก key๋ฅผ ๊ณ์ธต์ ์ผ๋ก ๋๋ ์ฃผ๋ ๊ฒ์ด ๊ท์น์ด๋ค. (์ผ์ข ์ ์ปจ๋ฒค์ ์ด๋ผ๊ณ ํ ์ ์๋ค.)
์๋ฅผ ๋ค์ด, userId 123์ธ ์ ์ ์ profile์ ์ ์ฅํ๊ณ ์ถ๋ค๊ณ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅํ๋ค.
1
user:123:profile
์ด ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ๋ง์ฝ, TTL 10๋ถ๋์๋ง ์ ์งํ๊ณ ์ถ๋ค๊ณ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅํ๋ฉด ๋๋ค.
1
set user:123:profile "์ ์ ํ๋กํ~" EX 600
๊ทธ๋ ๋ค๋ฉด, ์ฐ๋ฆฌ ํ๋ก์ ํธ์์ ์ฒ๋ผ user์ ํน์ ์ ๋ณด๋ฅผ ๋ฌถ์ด์ ์ ์ฅํ๊ณ ์ถ๋ค๊ณ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํ๋ฉด ์ข์๊น? ์ ๋ต์, HSET์ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
1
HSET user:123 userId 123 name "์ค์ ์ " hobbies "๋ฑ์ฐ,๋
์" recentMerchants "์คํ๋ฒ
์ค,์ฟ ํก" creditLimit 5000000 creditLeft 3200000
์ด๋ฐ์์ผ๋ก HSET์ผ๋ก ์ ์ฅ์ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ์ ์ฅ์ด ๋๋ ๊ฒ์ด๋ค.
1
2
3
4
5
6
7
8
user:123 โ {
"userId": "123",
"name": "์ค์ ์ ",
"hobbies": "๋ฑ์ฐ,๋
์",
"recentMerchants": "์คํ๋ฒ
์ค,์ฟ ํก",
"creditLimit": "5000000",
"creditLeft": "3200000"
}
์ด ๊ตฌ์กฐ๋, user:123๊ฐ key์ด๊ณ , ๊ทธ ์์ ๋ค์ด์๋ ๊ฐ๋ค์ด SET์ ํํ๋ก ์ ์ฅ๋๋ ๊ฒ์ด๋ค. HSET
์ Redis 4.0๋ถํฐ ์ฌ๋ฌ ํ๋๋ฅผ ํ ๋ฒ์ ๋ฃ๋ ๊ฑธ ๊ณต์ ์ง์ํ๊ณ ์์ด์, ์ด๋ฐ์์ ๊ตฌ์กฐ๊ฐ ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค.
์ฌ๊ธฐ๊น์ง ํ๋ฉด ๊ธฐ๋ณธ ์ค์ ๋ฐ ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ํ์ํ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋ํ ์ ๋ฆฌ๋ ๋์ด๋ค.
๊ทธ๋ฌ๋, ์ฌ๊ธฐ์ ๊ณผ์ฐ ํ์ํ DATA๋ค์ REDIS์ ์ด๋ ํ ํํ๋ก ๊ฐ์ ์ ์ฅํ ์ง์ ๋ํ ๊ณ ๋ฏผ์ด ์์๋คโฆ. ์ด ๋ถ๋ถ์ ๋ค์ํธ์