skip list
skip list
skip listλ νλ₯ μ μλ£κ΅¬μ‘°λΌκ³ λΆλ₯΄λ©°, κ²μμ΄λ μ½μ
μ O(logN)μ μλλ₯Ό 보μ₯νλ€. 리μ€νΈμ μ μ¬νμ§λ§, 리μ€νΈλ κ²μμ΄ O(N)μ΄λ€.
skip listλ λ³΄ν΅ μλμ κ°μ ννλ₯Ό κ°λλ€.

κ·Έλ¦Όμ²λΌ λ©ν° ν€λλ₯Ό κ°κ³ μμΌλ©°, λμ΄κ° μ¬λ¬ κ°λ€.
μ¬κΈ°μ λ§νλ λμ΄λ, νλμ λ Έλλ κ°(value)μ κ°μ§κ³ μλλ° λ Έλμ λ 벨(λμ΄)λ§λ€ κ°μ κ°μ κ°μ§λ€.
κ°μ κ°μ§λ§, ν€λμμ κ°λ¦¬ν€λ ν¬μΈν°κ° λ€λ₯΄λ€.
μ΄ λμ΄λ λλ€ νλ₯ λ‘ κ²°μ λλλ° λ³΄ν΅μ ν κ°μ©μ κΈ°λ³Έμ μΌλ‘ μκΈ΄λ€.
μ νλ₯ μ μλ£κ΅¬μ‘° μΈκ°?
λ Έλμ λμ΄. μ¦, λ Έλμ λ 벨μ νλ₯ λ‘ κ²°μ λλ€. λ λ²¨μ΄ νλ₯ μ μΌλ‘ κ³μ°λλ κ²μ μ μΈνλ©΄ λ§ν¬λ 리μ€νΈλ μ μ¬νλ€κ³ νλ€.
zslRandomLevel ν¨μλ redisμ skip list ꡬνμμ μλ‘μ΄ λ
Έλμ λ 벨μ κ²°μ νλ ν¨μμ΄λ€.
κΉκ² λΆμνμ§ μμμ§λ§, μ΄ ν¨μλ λλ€ν κ°μ μμ±νμ¬, κ·Έ κ°μ΄ νΉμ μκ³κ°λ³΄λ€ μμ λλ§λ€ λ 벨μ μ¦κ°μν€λ λ°©μμΌλ‘ μλνλ©° μ΅λ λ 벨μ μ΄κ³Όνμ§ μλλ‘ λ³΄μ₯λλ€.
κ²°κ³Όμ μΌλ‘, μ΄ ν¨μλ 1λ 벨μμ μμνμ¬ λ€μ λ λ²¨λ‘ μ¬λΌκ° νλ₯ μ΄ 1/4λ‘ μ€κ³λμ΄ μμΌλ©°, μ΅λ λ 벨μ 32μ΄λ€.
μ μ₯ μμ
μλ₯Ό λ€μ΄, scoreκ° 10, 20, 30μΈ μΈ κ°μ memberκ° μ‘΄μ¬νλ€κ³ νλ©΄ skip listλ λ€μκ³Ό κ°μ΄ ꡬμ±λλ€.
O(logN)μΌλ‘ νμμ΄ κ°λ₯ν μ΄μ
skip listλ μ¬λ¬ λ 벨μ μ°κ²° 리μ€νΈλ‘ ꡬμ±λλ€. Level 1μμμ νμμΌλ‘ λ³Έλ€λ©΄, λ§ν¬λ 리μ€νΈμ μ μ¬νκ² O(N)μ μλκ° λμ¨λ€. νμ§λ§ νμ ν¨μ¨μ±μ Treeμ μ μ¬νλ€.
κ°μ₯ μλ λ 벨μ λͺ¨λ μμ(μ€μ κ°)μ ν¬ν¨νκ³ , μμ λ λ²¨λ‘ κ°μλ‘ μμ μκ° μ€μ΄λ λ€.
κ° λ
Έλκ° μμ λ 벨μ ν¬ν¨λ νλ₯ μ 50%μ΄λ€. μ΄λ‘ μΈν΄ λ 벨 Kμλ νκ· μ μΌλ‘ N / 2^K κ°μ λ
Έλκ° ν¬ν¨λλ€.
νμ κ³Όμ :
μ΅μμ λ 벨μμ μμνμ¬, κ° λ 벨μμ μ€λ₯Έμͺ½μΌλ‘ μ΄λνλ©° νμνλ€.
λ μ΄μ μ΄λν μ μμΌλ©΄ ν λ¨κ³ μλ λ λ²¨λ‘ λ΄λ €κ°λ€.
μ΄ κ³Όμ μ λ°λ³΅νμ¬ μνλ μμμ λλ¬νλ€.
ex) 7μ μ°Ύλ κ³Όμ
Level 3μμ μμ: 1 β 9 (9κ° λ ν¬λ―λ‘ λ΄λ €κ°)
Level 2λ‘ λ΄λ €κ°: 1 β 5 β 9 (9κ° λ ν¬λ―λ‘ λ΄λ €κ°)
Level 1λ‘ λ΄λ €κ°: 5 β 7 β 9 (7μ μ°Ύμ)
μ΄ κ³Όμ μμ λͺ κ°μ λ Έλλ§ νμΈνκ³ λ λΉ λ₯΄κ² 7μ μ°Ύμ μ μλ€.
κ³Όμ μ 보면, Level1 μμλ 1λ², 3λ² λ Έλμ νμμ 건λ λ°λ κ²μ λ³Ό μ μλ€.
μΌλ° μ°κ²° 리μ€νΈμλ€λ©΄ 1~7κΉμ§ λͺ¨λ λ Έλλ₯Ό νμΈν΄μΌ νλ€.
κ° λ 벨μμ νμΈνλ λ Έλ μκ° μ νμ μ΄κ³ , λ 벨 μκ° logNμ λΉλ‘νκΈ° λλ¬Έμ μ 체 νμ μκ°μ΄ O(logN)μ΄ λλ€.
skip list ꡬ쑰
skip listλ quad node ννλ‘ κ΅¬νλλ€. λ°λΌμ ν λ μ΄μ΄ μμμ λ§ν¬λ 리μ€νΈμ μλ°©ν₯ νμ λΏλ§μλλΌ μμλλ‘λ λ§ν¬λ₯Ό κ°μ§κ³ μμ΄μ μμ , κ²μ, μ λ°μ΄νΈμλ μ©μ΄νλ€.

λ Έλ ꡬ쑰
backward: μ΄μ λ Έλλ₯Ό κ°λ₯΄ν€λ ν¬μΈν°
level[]: κ° λ λ²¨λ³ λ€μ λ Έλ μ 보 (ν¬μΈν°μ span)
score: μ λ ¬ κΈ°μ€μ΄ λλ μ μ (μ½μ μΌλ‘ λ€μ΄μ€λ μ μ)
ele: μ€μ μ μ₯λλ member λ°μ΄ν° (μ½μ μΌλ‘ λ€μ΄μ€λ member κ°μ΄ λ€μ΄μ΄)

skip listμμλ spanμ ν΅ν΄ κ° λ 벨μμ λ Έλκ° μΌλ§λ λ§μ λ Έλλ₯Ό 건λλ°λμ§λ₯Ό κΈ°λ‘νμ¬, νΉμ keyμ μμλ₯Ό μ½κ² κ³μ°ν μ μκ³ μ΄λ₯Ό ν΅ν΄ κ²μ μ λͺ κ°μ λ Έλλ₯Ό 건λλ°μ΄μΌ νλμ§λ₯Ό λΉ λ₯΄κ² μ μ μμ΄μ νμ μλλ₯Ό ν₯μμν¨λ€κ³ νλ€.
μλ₯Ό λ€μ΄, span=5μΈ κ²½μ°, νμ¬ λ
Έλ λ€μμ 5κ°μ λ
Έλκ° μλ€λ κ²μ μλ―Ένλ€.
Redisμμ skip list μ μ©
Redisλ Sorted Setμ λ΄λΆμ μΌλ‘ ZSetμ΄λΌκ³ νλ€. Sorted Setμ λ΄λΆμ μΌλ‘ λ κ°μ§ λ°μ΄ν° κ΅¬μ‘°λ‘ μ μ₯λλ€. Redisκ° λ°μ΄ν° ꡬ쑰λ₯Ό μ ννλ λ°, λ κ°μ§ μ‘°κ±΄μ΄ μλ€.
member μκ°
128κ° κΉμ§λzip listμλ£κ΅¬μ‘°μ μ μ₯λλ€.λ€λ₯Έ νλμ κ°(value)μ κΈΈμ΄κ° 64byteκΉμ§λ zip listμ μ μ₯λλ€.
129κ°λΆν°λ μλ£κ΅¬μ‘°λ₯Ό λ³νν΄μskip listμ μ μ₯λλ€.65 byte λΆν°λ skip listμ μ μ₯λλ€.
μ¬λ¬ λ©€λ² μ€ νλλΌλ κ°μ΄ 65 byte μ΄μμ΄λ©΄ λ³νλλ€.
μ΄ λκ°μ§λ OR 쑰건μ΄κΈ° λλ¬Έμ νλλΌλ 쑰건μ μΆ©μ‘±νλ©΄ λ λμ€ μλ²κ° μλμΌλ‘ μλ£κ΅¬μ‘°λ₯Ό λ³νν΄μ μ μ₯νλ€.
μ΄λ κ² νλ μ΄μ λ member μκ° μ μ λλ zip listκ° μ°μλ λ©λͺ¨λ¦¬ 곡κ°μ μ¬μ©νμ¬ λ©λͺ¨λ¦¬ μ€λ²ν€λλ₯Ό μ€μ΄κ³ , λΉ λ₯Έ μ±λ₯μ μ 곡νλ€κ³ νλ€. λ§μ½ memberκ° λ§μμ§λ©΄ O(logN)μ κ²μ, μ½μ , μμ λ₯Ό 보μ₯νλ skip listκ° λ μ ν©νλ€κ³ νλ€.
μ΄ μ€μ μ redis.confμ ADVANCDE CONFIGμ κ°μΌλ‘ μ‘°μ ν μ μλ€.
zset-max-ziplist-entriesλ Sorted Setμμ zip listλ‘ μ μ₯ν μ μλ μ΅λ μνΈλ¦¬(member) μλ₯Ό μ€μ νλ νλΌλ―Έν°μ΄λ€. 0μΌλ‘ μ€μ νλ©΄ μ²μλΆν° μ€ν΅ 리μ€νΈμ μ μ₯λμ΄ ν μ€νΈ μ μ±λ₯μ μ’ λ μ ννκ² νμ ν μ μλ€.zset-max-ziplist-valueλ zip listλ‘ μ μ₯ν μ μλ κ°(value)μ μ΅λ κΈΈμ΄μ΄λ€.
Last updated