Redis๋ ์ ์ด๋ ๊ฒ ๋น ๋ฅผ๊น?
1. In-Memory ๊ธฐ๋ฐ
DB ์ฑ๋ฅ ์ ํ(๋ณ๋ชฉ ๋ฑ)์ 99%๋ ๋์คํฌ I/O์์ ๋ฐ์ํ๋ค.
์ 1๊ณตํ๊ด 23๋์์ ๋ค์๋ ์ด์์ฒด์ ๊ฐ์ ์๊ฐ์ผ๋ก ์ ๊น ํ๊ทํด๋ณด์. ๋์คํฌ, ํํ HDD๋ ํ์ํ ๋ฐ์ดํฐ๋ง Page ๋จ์๋ก RAM์ ๊ฐ์ ธ์์ ์ ๊ทผํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ๋ง์ฝ ํน์ ํ๋ก์ธ์ค๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ ค๊ณ ํ ๋, L1/L2/L2 Cache์์ Miss๊ฐ ๋ฐ์ํ๊ณ , RAM์๋ ์กด์ฌํ์ง ์์ ๋ Page Fault๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ดํ, ๋์คํฌ์์ ํด๋น ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ํ์ด์ง๋ฅผ ์ฐพ์์ ๊ฐ์ ธ์ค๊ฒ ๋๋๋ฐ, ๋ง์ฝ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ชจ๋ Use ์ํ๋ผ๋ฉด Replacement Policy์ ์ํ์ฌ Page Replacement๊ฐ ์ผ์ด๋๋ค. ๊ฐ๋์ฉ ์์ฒญ ๋ฌด๊ฑฐ์ด ์์ ์ ํ ๋๋ฉด ๋์คํฌ๊ฐ ๋ฝ๋ฝ ๊ฐ๋ฆฌ๋ ๋ด๋ฉฐ ์ด๋ ค๋ฌ๋ผ๊ณ ์ธ์น๋ค๋ ๊ต์๋์ ๋ง์์ด ์๊ฐ๋๋ค.
๊ทผ๋ฐ ๋๋์ฒด ์ผ๋ง๋ ์๋ ์ฐจ์ด๊ฐ ๋๊ธธ๋ CPU, L1, L2, L3, RAM ๊ทธ๋ฆฌ๊ณ DISK ๋ ๋ฒจ๊น์ง ๋๋๋ ๊ฒ์ผ๊น? ์ค์ง์ ์ธ ์์น๋ก ์ดํด๋ณด์.
| ์ ์ฅ์ฅ์น | ์ ๊ทผ ์๊ฐ (Latency) |
|---|---|
| L1 Cache | ~1 ns |
| L2 Cache | |
| L3 Cache | |
| RAM (DRAM) | |
| SSD (NVMe) | |
| HDD |
์ ํ์์ ๋ณผ ์ ์๋ฏ์ด, RAM์ ๋ ์ดํด์๋ HDD๊ฐ ์๋ SSD๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋๋ผ๋ ์ต์ 1,000๋ฐฐ๊น์ง ์ฐจ์ด๊ฐ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. RDBMS๊ฐ ๋์คํฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ ค๋ฉด OS์ read() ์์คํ
์ฝ์ ๋ณด๋ด๊ณ , ๋์คํฌ์์ ์ํ๋ ํ์ด์ง๋ฅผ ์ฐพ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ณต์ฌํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ ๊ฒ์ด๋ค.
Redis๋ ์ด ๋ชจ๋ ๊ณผ์ ์ ์๋ตํ๋ค.
2. Single Thread
ํํ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด์๋ Multi-Thread๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง, Redis๋ ๊ธฐ๋ณธ์ ์ผ๋ก GET/SET ๋ฑ๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ์ ์ธ ๋ฉ์ธ ๋ก์ง์ ๋ํ์ฌ๋ Single-Thread ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ์ ๊ทธ๋ด๊น?
2-1. Context Switching์ ํจ์
์ด ์ญ์ ์ด์์ฒด์ ์๊ฐ์ผ๋ก ๋์๊ฐ์ผ ํ๋ค. Thread๊ฐ ์ฌ๋ฌ ๊ฐ๋ฉด CPU๋ ์ด๋ค์ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์คํํด์ผ ํ๋ค. ์ด๋, ํน์ ์ค๋ ๋์์ I/O ์์
์ด ๋ฐ์ํ๋ฉด Context Switching์ด ์ผ์ด๋๊ฒ ๋๋๋ฐ, ํด๋น I/O ์์
์ ์ํํ๋ ๋์ ๋ค๋ฅธ Thread๊ฐ ์คํ๋๋ค.์ด ๊ณผ์ ์์ ์คํ ํ๋ฆ์ ๋ฌธ๋งฅ, ์ฆ ๋ง ๊ทธ๋๋ก Context๋ฅผ Switchingํ๋ ์์
์ด ์ด๋ฃจ์ด์ ธ์ผ ํ๊ณ , ์ด ์ญ์ 1~5 ฮผs์ ๋น์ฉ์ด ์๋ชจ๋๋ค. Redis GET์ ์ฝ 100 ฮผs, SET์ ์ฝ 200~500 ฮผs ์ ๋์ ์๊ฐ์ด ์๋ชจ๋๊ธฐ ๋๋ฌธ์ Switching ๋น์ฉ์ด ๋ ๋น์ธ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
2-2. Lock-Free
Multi-Thread ํ๊ฒฝ์์, ๋ง์ฝ ์ฌ๋ฌ Thread๊ฐ ๋์์ ๊ฐ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ฒ ๋๋ฉด Race Condition ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ Mutex ๋ฑ์ Lock์ ์ฌ์ฉํด์ผ ํ๋ค. ํ์ง๋ง Lock์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ํ๋์ Thread๊ฐ Lock์ ์ป์์ ๋, ๋๋จธ์ง Thread๋ค์ Blocking, ์ฆ Lock์ ์ป์ ๋๊น์ง ๋๊ธฐํด์ผ ํ๋ฏ๋ก ๊ทน์ฌํ ๋ณ๋ชฉ์ด ์๊ธฐ๊ฒ ๋๋ค.
2-3. Atomicity
Single-Thread ํ๊ฒฝ์ด๊ธฐ ๋๋ฌธ์ ํ ๋ฒ์ ๋จ ํ๋์ ๋ช ๋ น์ด๋ง ์ฒ๋ฆฌํ๊ฒ ๋๋ค. Redis๋ Single-Thread ํ๊ฒฝ์ด๋ฏ๋ก Lock์ด ํ์์๊ฒ ๋๊ณ , ์ด๋ก์จ Atomicity๋ ์ป์ ์ ์๋ค.
2-ษ. Redis 6.0 ์ดํ
๋๋ฌด ๋ง์ ๋คํธ์ํฌ ์์ฒญ์ด ๋ค์ด์ค๋ฉด I/O ๋จ์์๋ ๋ณ๋ชฉ์ด ๋ฐ์ํ๊ธฐ ์์ํ๋ค. ๊ทธ๋์ ์ต์ Redis๋ ๋คํธ์ํฌ I/O(์์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ)์๋ง Multi-Thread๋ฅผ ๋์ ํ๊ณ , ์ค์ ๋ช ๋ น์ด ์คํ์ ์ฌ์ ํ Single-Thread๋ฅผ ์ ์งํ์๋ค.