參考:有序集合物件的編碼是:
1.1 ziplist編碼
ziplist編碼的有序集合物件使用壓縮列表作為底層實現,每個集合元素使用兩個緊挨在一起的壓縮列表節點來儲存,第乙個節點儲存元素的成員(member),第二個元素儲存元素的分值(score)。
壓縮列表內的集合元素按分值從小到大排序,分值較小的元素被放置在靠近表頭的位置,分值較大的元素被放置在靠近表尾的位置。
示例:
如果price鍵的值物件使用的是ziplist編碼,值物件、以及物件使用的壓縮列表如下圖所示:
1.2 skiplist編碼
skiplist編碼的有序集合物件使用zset結構作為底層實現,乙個zset結構同時包含乙個字典和乙個跳躍表。
(1)zsl跳躍表
zset結構中的zsl跳躍表按分值從小到大儲存了所有集合元素,每個跳躍表節點都儲存了乙個集合元素:
通過這個跳躍表,程式可以對有序集合進行範圍型操作,比如zrank、zrange等命令就是基於跳躍表api來實現的。
(2)dict字典
zset結構中的dict字典為有序集合建立了乙個從成員到分值的對映,字典中的每個鍵值對都儲存了乙個集合元素:
通過這個字典,程式可以用o(1)複雜度查詢給定成員的分值,zscore命令根據這一特性實現的。
注:跳躍表和字典兩種資料結構會通過指標共享相同元素的成員和分值。
(3)使用skiplist編碼的有序集合物件、物件所使用的zset結構如下圖所示:
skiplist編碼的有序集合物件
有序集合物件同時被儲存在字典和跳躍表中
有序集合物件同時滿足以下2個條件時,物件使用ziplist編碼,否則使用skiplist編碼。
注:上面的128、64閾值是可以修改的,可以檢視zset-max-ziplist-entries
和zset-max-ziplist-value
選項。
redis> config get zset-max-ziplist-entries
1)"zset-max-ziplist-entries"
2)"128"
redis> config get zset-max-ziplist-value
1)"zset-max-ziplist-value"
2)"64"
2.1 ziplist -> skiplist
當使用ziplist編碼的物件所需的兩個條件任意乙個不滿足時,都會執行編碼轉換工作,將原本儲存在壓縮列表裡面的所有集合元素轉移到zset裡,並將編碼改為skiplist。
(1)元素數量超過閾值
臨時設定zset-max-ziplist-entries
為4進行測試。
redis> config set zset-max-ziplist-entries 4
okredis> zadd nums 1 1 2 2 3 3 4 4
(integer) 4
redis> object encoding nums
"ziplist"
redis> zadd nums 5 5
(integer) 1
redis> zcard nums
(integer) 5
redis> object encoding nums
"skiplist"
(2)元素成員過長
臨時設定zset-max-ziplist-value
為4進行測試。
redis> config set zset-max-ziplist-value 4
okredis> zadd strs 1 a 2 bb 3 ccc 4 dddd
(integer) 4
redis> object encoding strs
"ziplist"
redis> zadd strs 5 eeeee
(integer) 1
redis> object encoding strs
"skiplist"
redis筆記 有序集合物件
1.有序集合的編碼可以是ziplist或者skiplist 2.當使用ziplist編碼時,每個集合元素使用兩個緊挨在一起的壓縮列表節點來儲存,第乙個節點儲存元素的成員,第二個元素則儲存元素的分值 3.ziplist內的集合元素按分值從小到大進行排序,分值小的元素被放置表頭方向 4.當使用skipl...
redis學習筆記五 有序集合
1 增加元素 zadd key val property val prperty.增加key中property的值,如果元素已經存在,則修改元素的值 2 獲取元素的值 zscore key property 3 獲取排名在某個範圍的元素列表 zrange key start stop withsco...
Redis學習筆記 集合物件set
參考 集合物件的編碼是 1.1 intset編碼 intset編碼的集合物件使用整數集合作為底層實現,集合物件包含的所有元素都被儲存在整數集合裡面。建立乙個使用intset編碼的集合物件 redis sadd nums 1 3 5 integer 3 redis object encoding nu...