Redis學習筆記 有序集合物件zset

2021-09-24 23:43:58 字數 2358 閱讀 9930

參考:有序集合物件的編碼是:

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-entrieszset-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...