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๋Š” ๊ณ ์œ ํ•œ ๊ฐ’์ด๋ฉฐ ์ค‘๋ณต์œผ๋กœ ์ €์žฅ๋  ์ˆ˜ ์—†๋‹ค.

์ฃผ์š” ํŠน์ง•

  1. ๊ณ ์œ ํ•œ ๋ฉค๋ฒ„

ZSET์— ์ €์žฅ๋˜๋Š” ๊ฐ member๋Š” ์ง‘ํ•ฉ ๋‚ด์—์„œ ์œ ์ผํ•˜๋ฉฐ ์ค‘๋ณต ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  1. ์ž๋™ ์ •๋ ฌ

member๋Š” score์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค. ๋™์ผํ•œ score์ธ ๊ฒฝ์šฐ member๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์ „ ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

  1. ํšจ์œจ์ ์ธ ์กฐํšŒ

ํŠน์ • ์ ์œ„์˜ score๋ฅผ ๊ฐ€์ง„ member๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ƒ์œ„ 10๊ฐœ์˜ member๋‚˜ ํŠน์ • score ๋ฒ”์œ„ ๋‚ด์˜ member๋ฅผ ์‰ฝ๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

key, member prefix ๋„ค์ด๋ฐ

ZSET์˜ key ๋˜๋Š” member๋ฅผ prefix๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. key prefix ๋ฐฉ์‹

  1. member prefix ๋ฐฉ์‹

์ผ๋ฐ˜์ ์œผ๋กœ key์— prefix ๋ฐฉ์‹์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

ZADD ๋™์ž‘ ๊ณผ์ •

zip list ๊ธฐ์ค€

  1. ์ƒˆ๋กœ์šด member ์ถ”๊ฐ€

    • score๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์ ์ ˆํ•œ ์‚ฝ์ž… ์œ„์น˜๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

    • ํ•ด๋‹น ์œ„์น˜ ์ดํ›„์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋’ค๋กœ ์ด๋™

    • ์ƒˆ๋กœ์šด <member, score> ์‚ฝ์ž…

  2. ๊ธฐ์กด member ์ˆ˜์ •

    • ์„ ํ˜• ํƒ์ƒ‰์œผ๋กœ member ์ฐพ๊ธฐ

    • score ๋ณ€๊ฒฝ ์‹œ ์‚ญ์ œ ํ›„ ์žฌ์‚ฝ์ž…

skip list ๊ธฐ์ค€

์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

  1. ๊ฐ€์žฅ ๋จผ์ € ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. (score: 10, ele: โ€œmember1โ€)

  2. ๋…ธ๋“œ์˜ ๋ ˆ๋ฒจ์„ ๋ฌด์ž‘์œ„๋กœ ๊ฒฐ์ •ํ•œ๋‹ค. (1~32 ์‚ฌ์ด)

  3. score(10)์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค.

    • ๊ฐ€์žฅ ๋†’์€ ๋ ˆ๋ฒจ๋ถ€ํ„ฐ ๋‚ฎ์€ ๋ ˆ๋ฒจ๋กœ ์ˆ˜ํ‰์œผ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ์‚ฝ์ž…ํ•˜๊ธฐ ์ ์ ˆํ•œ ์œ„์น˜๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

  4. ํƒ์ƒ‰ํ•œ ์œ„์น˜์— ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐ

    • ๋ชจ๋“  level์—์„œ ์ด์ „/๋‹ค์Œ ๋…ธ๋“œ ํฌ์ธํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  span ๊ฐ’์„ ์กฐ์ •ํ•œ๋‹ค.

  5. Hash Table ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

    • member:score๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ๋งคํ•‘ํ•œ๋‹ค. O(1) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • member์˜ score๋ฅผ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Last updated