SortedSet (ZSET)
๋ณดํต ์งํฉ(Set) ์๋ฃ๊ตฌ์กฐ๋ ์์๋ค์ ์ค๋ณต์ ํ์ฉํ์ง ์๋๋ค. ๋ํ, ์์์ ์์๋ฅผ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์, ํน์ ํ ์์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ์ด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์ ํฉํ์ง ์์ ์ ์๋ค.
Redis๋ ์ด๋ฌํ ์งํฉ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ ์งํฉ ๋ฐ์ดํฐ์ ์ ๋ ฌ์ ์ํํ๋ SortedSet ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ค.
SortedSet
Redis์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ฒด๋ฅผ ๊ฐ๋ฅดํค๋ key๊ฐ ์กด์ฌํ๋๋ฐ, ์ด๊ฒ์ด SortedSet์ด๋ค.
ํด์์ฒ๋ผ ๋ณด์ด๋ ์ปฌ๋ ์
์ด ์กด์ฌํ๋ฉฐ, ์ด๋ฅผ key-value ์์ผ๋ก ๋ถ๋ฅด์ง ์๊ณ member-score ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ชจ๋ member๋ score๋ฅผ ๊ฐ์ง๋ฉฐ, score๋ ํญ์ ์ซ์์ด๋ค.
zip list vs listpack
ZSET์ ์ด๊ธฐ ๋ฒ์ ์์๋ ์์ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ zip list๋ฅผ ์ฌ์ฉํ๋ค. ํ์ง๋ง Redis 7.0 ์ดํ๋ถํฐ๋ ๋ ์ด์ zip list๋ฅผ ์ฌ์ฉํ์ง ์๊ณ listpack์ด๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋์ฒด๋์๋ค.
listpack์ zip list์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ฑ์ฅํ๋ค. ์ฌ๊ธฐ์ ๋จ์ ์, ๋ฐ์ดํฐ ๋ณ๊ฒฝ(์ฆ๊ฐ) ์ prevlen์ด 1 โ 5๋ก ๋ฐ์ดํธ๋ก ์ฐ์์ ์ผ๋ก ์ฆ๊ฐ๋์ด zip list ์์ ๋ชจ๋ ์ํธ๋ฆฌ๋ฅผ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ๋ผ๊ณ ํ๋ค.
listpack์ ์ด๋ฌํ ๋จ์ ์ ๊ฐ์ ํด์ prevlen ํ๋๋ฅผ ์ ๊ฑฐํ๊ณ backlen์ ์ฌ์ฉํด์ ํ์ฌ ์ํธ์ ์์๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ค.
ZSET ๊ตฌ์กฐ

skip list
score๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋์ด ์์ผ๋ฉฐ member๋ค์ด ๋งํฌ๋์ด ์๋ค.
hash table
member๋ฅผ key๋ก, score๋ฅผ value๋ก ์ ์ฅํ๋ค.
O(1) ์๊ฐ ๋ณต์ก๋๋ก ํน์ member์ score๋ฅผ ๋ฐ๋ก ์ฐพ์ ์ ์๋ค.
์ด๋ฌํ ๊ตฌ์กฐ์ ํน์ง์ผ๋ก ์ฝ์ , ์ญ์ , ๋ฐ ๊ฒ์ ์ฐ์ฐ์ด ํ๊ท O(log N)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
๊ตฌ์ฑ์์

Key๋ ZSET์ ์๋ณํ๋ค.
Score๋ member์ ์ ์๋ก ์ค์ ๋๋ค.
member๋ ๊ณ ์ ํ ๊ฐ์ด๋ฉฐ ์ค๋ณต์ผ๋ก ์ ์ฅ๋ ์ ์๋ค.
์ฃผ์ ํน์ง
๊ณ ์ ํ ๋ฉค๋ฒ
ZSET์ ์ ์ฅ๋๋ ๊ฐ member๋ ์งํฉ ๋ด์์ ์ ์ผํ๋ฉฐ ์ค๋ณต ๊ฐ์ ํ์ฉํ์ง ์๋๋ค.
์๋ ์ ๋ ฌ
member๋ score์ ๋ฐ๋ผ ์๋์ผ๋ก ์ ๋ ฌ๋๋ค. ๋์ผํ score์ธ ๊ฒฝ์ฐ member๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ์ ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง๋ค.
ํจ์จ์ ์ธ ์กฐํ
ํน์ ์ ์์ score๋ฅผ ๊ฐ์ง member๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฒ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์์ 10๊ฐ์ member๋ ํน์ score ๋ฒ์ ๋ด์ member๋ฅผ ์ฝ๊ฒ ์กฐํํ ์ ์๋ค.
key, member prefix ๋ค์ด๋ฐ
ZSET์ key ๋๋ member๋ฅผ prefix๋ก ๊ตฌ๋ถํ ์ ์๋ค.
key prefix ๋ฐฉ์

member prefix ๋ฐฉ์

์ผ๋ฐ์ ์ผ๋ก key์ prefix ๋ฐฉ์์ ๋ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค.
ZADD ๋์ ๊ณผ์
zip list ๊ธฐ์ค
์๋ก์ด member ์ถ๊ฐ
score๋ฅผ ๋น๊ตํ๋ฉฐ ์ ์ ํ ์ฝ์ ์์น๋ฅผ ํ์ํ๋ค.
ํด๋น ์์น ์ดํ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ก ์ด๋
์๋ก์ด <member, score> ์ฝ์
๊ธฐ์กด member ์์
์ ํ ํ์์ผ๋ก member ์ฐพ๊ธฐ
score ๋ณ๊ฒฝ ์ ์ญ์ ํ ์ฌ์ฝ์
skip list ๊ธฐ์ค
์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๊ฐ์ฅ ๋จผ์ ์๋ก์ด ๋ ธ๋๋ฅผ ์์ฑํ๋ค.
(score: 10, ele: โmember1โ)๋ ธ๋์ ๋ ๋ฒจ์ ๋ฌด์์๋ก ๊ฒฐ์ ํ๋ค. (1~32 ์ฌ์ด)
score(10)์ ๊ธฐ์ค์ผ๋ก ์ฝ์ ํ ์์น๋ฅผ ์ฐพ๋๋ค.
๊ฐ์ฅ ๋์ ๋ ๋ฒจ๋ถํฐ ๋ฎ์ ๋ ๋ฒจ๋ก ์ํ์ผ๋ก ์ด๋ํ๋ฉด์ ์ฝ์ ํ๊ธฐ ์ ์ ํ ์์น๋ฅผ ํ์ํ๋ค.
ํ์ํ ์์น์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐ
๋ชจ๋ level์์ ์ด์ /๋ค์ ๋ ธ๋ ํฌ์ธํฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ span ๊ฐ์ ์กฐ์ ํ๋ค.
Hash Table ์ ๋ฐ์ดํธ ํ๋ค.
member:score๋ฅผ ํด์ ํ ์ด๋ธ์ ๋งคํํ๋ค. O(1) ์๊ฐ ๋ณต์ก๋๋ก ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํน์ member์ score๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํ๊ฑฐ๋ ์ ๋ฐ์ดํธ ํ ์ ์๋ค.
Last updated