
์ต๊ทผ Redis๋ฅผ ํ์ฉํ์ฌ ์ ์ ๋ณ ์๋ฆผ ๋ฐ์ก ์ด๋ ฅ์ ๊ด๋ฆฌํ๊ณ , ๋์ผํ ์ ์ ์๊ฒ ๊ฐ์ ๊ฒ์๊ธ์ด ์ค๋ณต ๋ฐ์ก๋๋ ๊ฒ์ ๋ฐฉ์งํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ์์๋ค. ์ฒ๋ฆฌํด์ผ ํ ์์ฒญ ์๋ ์ฝ 300๋ง ๊ฑด,,
์ด ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด Redis์ String, Set, Bitmap ์ค ์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํ ๊น?
๊ฐ ํ์ ์ ํน์ง๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฑ์ ๋ํด ์ดํด๋ณด์.
(๊ฒ์๊ธ ID๋ 15๊ฐ, ์ ์ ID๋ 1~300๋ง, ํ๋์ ๊ฒ์๊ธ์ด ์ฌ๋ฌ ์ ์ ์๊ฒ ๋ฐ์ก์ด ๊ฐ๋ฅํ๋ค๊ณ ๊ฐ์ ํ๋ค.)
์๋์์ ์ฌ์ฉ๋๋ INFO memory ๋ช ๋ น์ด์ Redis ๋ฉ๋ชจ๋ฆฌ ํ๋์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ๋ค.
| ๋ฉ๋ชจ๋ฆฌ ํ๋ | ์ค๋ช |
| used_memory | ํ์ฌ Redis์์ ์ฌ์ฉ์ค์ธ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํธ ์ |
| used_memory_human | used_memory์ ๋ํด ์ฌ๋์ด ์ฝ๊ธฐ ์ฌ์ด ํ์์ผ๋ก ํ์ํ ๊ฐ |
| used_memory_peak | Redis์์ ์ฌ์ฉ๋ ์ต๊ณ ์น ๋ฉ๋ชจ๋ฆฌ |
| used_memory_peak_perc | ํผํฌ ์ฌ์ฉ๋ ์ค ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋น์จ |
| used_memory_overhead | Redis ์ค๋ฒํค๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ (์ค์ ๋ฐ์ดํฐ ์ธ key, metadata ๋ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ) |
| used_memory_dataset | ์ค์ ๋ฐ์ดํฐ๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ ์ (used_memory - used_memory_overhead) |
| used_memory_dataset_perc | ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ค ์ค์ ๋ฐ์ดํฐ๊ฐ ์ฐจ์งํ๋ ๋น์จ |
String
String ํ์ ์ ํ ์คํธ, ์ง๋ ฌํ๋ ๊ฐ์ฒด, ์ด์ง ๋ฐฐ์ด, ๋ฐ์ดํธ ์ํ์ค ๋ฑ์ ์ ์ฅํ๋ Redis์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์ฃผ๋ก ์บ์ฑ์ ์ฌ์ฉ๋์ง๋ง, ์นด์ดํฐ ๊ตฌํ์ด๋ ๋นํธ ์ฐ์ฐ ๋ฑ์ ์ถ๊ฐ ๊ธฐ๋ฅ๋ ์ง์ํ๋ค.
String ํ์ ์๋ GET, SET, MGET, MSET, SETNX, INCR ๋ฑ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ฒ์๊ธ ๋ณ๋ก ์ ์ ๋ฅผ ๊ด๋ฆฌํ๋ ์ผ์ด์ค
- key: community:post:{post_id}
- value: {user_id}

300๋ง์ ๋ฐ์ดํฐ๋ฅผ String ํ์ ์ผ๋ก ๋ฃ์ ๊ฒฐ๊ณผ
- used_memory_human: 201.16MB
- used_memory_peak_perc: 4.14%
- used_memory_dataset: 63,423,592 bytes(60.48MB)
- used_memory_overhead: 147,512,176 bytes(140.71MB)
- used_memory_dataset_perc: 30.21%
์ ์ ๋ณ ๊ฒ์๊ธ์ ๊ด๋ฆฌํ๋ ์ผ์ด์ค
- key: community:post:{user_id}
- value: {post_id}

300๋ง์ ๋ฐ์ดํฐ๋ฅผ String ํ์ ์ผ๋ก ๋ฃ์ ๊ฒฐ๊ณผ
- used_memory_human: 192.87MB
- used_memory_peak_perc: 3.97%
- used_memory_dataset: 54,743,408 bytes(52.20MB)
- used_memory_overhead: 147,493,744 bytes(140.66MB)
- used_memory_dataset_perc: 27.20%
๋ถ์
๊ฒ์๊ธ ID์ ์ ์ ID ์ค ์ด๋ ํ ๋ฐ์ดํฐ๋ฅผ key๋ก ์ฌ์ฉํ๋๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ์ฌํ๋ค.
๋ฐ๋ผ์ String ํ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์ ์ ํ key์ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ๋ฏ ํ๋ค.
Set
Set์ ์ธ์ด์์ ์ฌ์ฉ๋๋ ์๋ฃ๊ตฌ์กฐ์ ๋์ผํ๊ฒ ์ค๋ณต์ ํ์ฉํ์ง ์๋ ๊ณ ์ ํ ๊ฐ๋ค์ ์ ์ฅํ๋ ๋ฐ์ดํฐ ํ์ ์ด๋ค.
Set ํ์ ์์๋ SADD, SCARD, SMEMBERS, SREM ๋ฑ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Redis์ ์ ์ฅ๋๋ key-value ๊ตฌ์กฐ
- key: community:post:{post_id}
- value: {user_ids}


- used_memory_human: 100.69MB
- used_memory_peak_perc: 2.07%
- used_memory_dataset: 103,127,040 bytes(98.35MB)
- used_memory_overhead: 2,459,176 bytes(2.34MB)
- used_memory_dataset_perc: 98.61%

Bitmap
Bitmap์ ์ค์ ๋ฐ์ดํฐ ํ์ ์ด ์๋, ๋นํธ ์ฐ์ฐ์ด ๊ฐ๋ฅํ String ํ์ ์ ํ์ฉํ ํ์์ด๋ค.
String์ ์ต๋ ๊ธธ์ด๊ฐ 512MB์ด๋ฏ๋ก ์ต๋ 2^32๊ฐ์ ๋นํธ๊น์ง ์ ์ฅํ ์ ์๋ค.
๋์ผํ key์ ๋ํด ๋ง์ ๋นํธ๋ฅผ ์ ์ฅํ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
Redis์ ์ ์ฅ๋๋ key-value ๊ตฌ์กฐ
- key: community:post:{post_id}
- value: bit(0 or 1, user_id์ bit 1 ๊ฐ์ผ๋ก ์ค์ )
์๋ฅผ ๋ค์ด์, post_id๊ฐ 100์ธ ๊ฒ์๊ธ์ ๋ํด user_id๊ฐ 1000, 2000์ธ ์ ์ ๊ฐ ์๋ฆผ ๋ฐ์ก์ ๋ฐ์๋ค๋ฉด
SETBIT community:post:100 1000 1 # user_id 1000๋ฒ ์์น์ 1 ์ค์
SETBIT community:post:100 2000 1 # user_id 2000๋ฒ ์์น์ 1 ์ค์
GETBIT community:post:100 1001 # user_id 1001๋ฒ ์์น๋ 0 (๋ฏธ๋ฐ์ก)


- used_memory_human: 6.29MB
- used_memory_peak_perc: 0.13%
- used_memory_dataset: 5,182,920 bytes(4.94MB)
- used_memory_overhead: 1,416,160 bytes(1.35MB)
- used_memory_dataset_perc: 92.57%

Bitmap ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ถ์
์์ ํ ์คํธ ๊ฒฐ๊ณผ, Bitmap์ String์ด๋ Set์ ๋นํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ํ์ ํ ์ ๋ค. ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊น?

์ฒซ ๋ฒ์งธ key(post_id = 10000)์ ๋ง์ง๋ง key(post_id = 24000)์ธ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
community:post:10000 ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: 393256(์ฝ 32KB)
- ๋ฐ์ดํฐ ์(BITCOUNT): 200,000
- ํ์ํ ์ต์ ๋นํธ(1byte = 8bit): 200,000 bits = 25,000 bytes (25KB), ์ค๋ฒํค๋ ์ฝ 7KB
- Bitmap์์ ๊ฐ์ฅ ์ฒ์ bit๊ฐ 1์ธ ์์น: 1
community:post:24000 ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: 392356 (์ฝ 384KB)
- ๋ฐ์ดํฐ ์(BITCOUNT): 200,000
- ํ์ํ ์ต์ ๋นํธ(1byte = 8bit): 3,000,000 bits = 375,000 bytes (375KB), ์ค๋ฒํค๋ ์ฝ 9KB
- Bitmap์์ ๊ฐ์ฅ ์ฒ์ bit๊ฐ 1์ธ ์์น: 2,800,001
์ค์ ๋ฐ์ดํฐ ๊ฐ์๋ ๋์ผ(20๋ง ๊ฐ)ํ์ง๋ง, Bitmap์ด ํ ๋นํด์ผ ํ๋ ๋นํธ ๋ฒ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ key์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฝ 10๋ฐฐ์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค. (32KB, 384KB)

์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ธํด๋ณด๋ฉด BITCOUNT ๊ฐ์ 1์ด์ง๋ง, ํ์ํ ์ต์ ๋นํธ๊ฐ 3,000,000 bits ์ด๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ด 384KB๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
๊ฒฐ๋ก
๋ฐ๋ผ์, Bitmap์ ๊ฒฝ์ฐ ํน์ key ๋ด์ ๋ฐ์ดํฐ๊ฐ ์ผ๋ง๋ ์กฐ๋ฐํ๊ฒ ๋ถํฌ๋์ด ์๋์ง์ ํฌ๊ฒ ์ํฅ์ ๋ฐ๋๋ค.
๊ทธ๋ ๊ธฐ์ ๋์ผํ ์ํฉ์์ key๊ฐ ๋๋ post_id๊ฐ ๋ง์์๋ก bitmap์ ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์ ๋ ๋นํจ์จ์ ์ธ ์ ํ์ด ๋๋ค.
๋๊ธ