zip list

Redis๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ(RAM)์— ์ €์žฅํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋””์Šคํฌ์— ๋น„ํ•ด ๋น„์‹ผ ์ž์›์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด zip list๋ผ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋Š” ์ž‘์€ ํฌ๊ธฐ์˜ ๋ฌธ์ž์—ด๋“ค์„ ์ €์žฅํ•˜๋Š”๋ฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค.

์ฃผ๋กœ Redis์˜ List, Hash, ZSet(Sorted Set) ๋“ฑ์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

๋ฐฐ์—ด๊ณผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

๋ฐฐ์—ด์€ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๊ณ  ๋™์  ํ• ๋‹น์ด ์–ด๋ ต๋‹ค. ๋˜ํ•œ ์ค‘๊ฐ„์— ์‚ฝ์ž…/์‚ญ์ œ ์‹œ ๋ชจ๋“  ์š”์†Œ์˜ ์ด๋™์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Š” O(N) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•˜๋Š” next/prev ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ๊ฐ ๋…ธ๋“œ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ์ƒ ํฉ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ ํšจ์œจ์ด ๋–จ์–ด์ง„๋‹ค.

zip list๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ๋ฐฐ์—ด์˜ ํ™•์žฅ์„ฑ๊ณผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ์‚ฝ์ž…/์‚ญ์ œ ์šฉ์ด์„ฑ์˜ ์žฅ์ ์„ ๊ฐ€์ง€๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ๊นŒ์ง€ ๊ฐ–์ถ˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

๊ทธ ์ด์œ ๋Š” ๋™์ ์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๊ณ , ํฌ์ธํ„ฐ ๋Œ€์‹  ์ด์ „ ์—”ํŠธ๋ฆฌ์˜ ๊ธธ์ด๋งŒ ์ €์žฅํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•œ๋‹ค.

zip list ์ž๋ฃŒ๊ตฌ์กฐ

zip list๋Š” ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

๊ตฌ์กฐ๋ฅผ ๋ดค์„ ๋•Œ ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ• ๋‹นํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ •ํ™•ํžˆ ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ฒผ๋‹ค.

์กฐ์‚ฌํ•œ ๋ฐ”๋กœ๋Š”, ์‹ค์ œ ์ˆœ์ˆ˜ ๋ฐฐ์—ด ํ˜น์€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ, ๋‘ ๊ฐ€์ง€์˜ ์žฅ์ ์„ ๊ฒฐํ•ฉํ•œ ํŠน๋ณ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ผ๊ณ  ํ•œ๋‹ค.

  • ์—ฐ์†๋œ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ๊ณ ์ • ํฌ๊ธฐ๋กœ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋™์ ์œผ๋กœ ํ• ๋‹น

  • ๊ฐ ๋…ธ๋“œ๋Š” ์ด์ „/๋‹ค์Œ ์—”ํŠธ๋ฆฌ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์„œ ์–‘๋ฐฉํ–ฅ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅ

์ด๋ ‡๊ฒŒ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จํŽธํ™”๋ฅผ ๊ฐ์†Œํ•˜๊ณ  ์บ์‹œ ์ง€์—ญ์„ฑ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์—ฐ์†๋œ ๊ฐ ๋ธ”๋ก์€ ํ—ค๋”(zlbytes, zltail, zllen)์™€ ์—”ํŠธ๋ฆฌ๋“ค, ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” zlend๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

ํ—ค๋”

  • zlbytes: zip list ์ด ๋ฐ”์ดํŠธ ์ˆ˜

  • ztail: ๋งˆ์ง€๋ง‰ ์—”ํŠธ๋ฆฌ ์‹œ์ž‘ ์ง€์ (offset)

  • zllen: zip list์˜ ์ด ์—”ํŠธ๋ฆฌ ์ˆ˜

  • zlend: zip list์˜ ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ”์ดํŠธ

์—”ํŠธ๋ฆฌ ๊ตฌ์กฐ

  1. prelen(previous_entry_length)

์ด์ „ ์—”ํŠธ๋ฆฌ ๊ธธ์ด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค. ์ด์ „ ์—”ํŠธ๋ฆฌ๋ฅผ ์ฐพ์„ ๋•Œ, ํ˜„์žฌ ์œ„์น˜์˜ prelen ๊ฐ’์„ ์ฝ๊ณ  ๊ทธ ํฌ๊ธฐ๋งŒํผ ๋’ค๋กœ ์ด๋™ํ•˜๋ฉด์„œ ์ด์ „ ์—”ํŠธ๋ฆฌ์˜ ์‹œ์ž‘ ์ ์— ๋„๋‹ฌํ•œ๋‹ค.

  1. itself len(encoding + length):

์—”ํŠธ๋ฆฌ ์ž์‹ ์˜ ๊ฐ’(value)์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์ˆœ๋ฐฉํ–ฅ ํƒ์ƒ‰๊ณผ ๊ฐ’ ์กฐํšŒ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ํ˜„์žฌ ์—”ํŠธ๋ฆฌ์˜ ํƒ€์ž…๊ณผ ๊ธธ์ด ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ, ์ •์ˆ˜๊ฐ’์˜ ๊ฒฝ์šฐ์—๋Š” ํŠน๋ณ„ํ•œ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

  1. value(actual data):

์‹ค์ œ๋กœ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค. ๋ฌธ์ž์—ด ๋˜๋Š” ์ •์ˆ˜ ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

๋งŒ์•ฝ ์‹ค์ˆ˜์˜ ๊ฒฝ์šฐ ์ˆซ์ž๋ฅผ ์ง์ ‘ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์ด์œ ๋Š” doubleํ˜•์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ๋ฅผ ์ €์žฅํ•œ๋‹ค.

Summary

์ผ๋ฐ˜์ ์ธ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ผ๋ฉด, ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค next/prev ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ zip list์—์„œ๋Š” ์ด์ „ ์—”ํŠธ๋ฆฌ์˜ ๊ธธ์ด๋งŒ ์ €์žฅํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š” ์—†์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์ ˆ์•ฝ์— ํšจ์œจ์ ์ด๋‹ค.

Reference

Last updated