Redis閱讀筆記 集合物件

2022-06-15 06:12:08 字數 2110 閱讀 4699

​ 集合物件的編碼可以是intset或hashtable。

​ intset編碼的集合物件使用整數集合作為底層實現, 集合物件包含的所有元素都被儲存再整數集合裡。

​ 舉個例子, 以下**將建立如下所示的intset編碼集合物件:

127.0.0.1:6379> sadd numbers 1 3 5

(integer) 3

redisobject

type

redis_set

encoding

redis_encoding_intset

ptr→intset

...encoding

intset_enc_int16

length

3

contents→1

35​ 另一方面, hashtable編碼的集合物件使用字典作為底層實現, 字典的每個鍵都是乙個字串物件, 每個字串物件包含了乙個集合元素,而字典的值全部被設定為null。

​ 舉個例子, 以下**將建立如下圖所示的hashtable編碼集合物件:

(integer) 3

redisobject

type

redis_set

encoding

redis_encoding_ht

ptr→dict

...stringobject

"cherry"

→null

→null

stringobject

"banana"

→null

​ 當集合物件可以同時滿足以下兩個條件時, 物件使用intset編碼:

​ 不能滿足這兩個條件的集合物件需要使用hashtable編碼。

注意

​ 這兩個條件的上限值是可以修改的,具體請看配置檔案中關於set-max-intset-entries選項的說明。

​ 對於使用intset編碼的集合物件來說, 當使用intset編碼所需的兩個條件的任意乙個不能被滿足時, 就會執行物件的編碼轉換操作,原本儲存再整數集合中的所有元素都會被轉移並儲存到字典裡, 並且物件的編碼也會從intset變為hashtable。

​ 舉個例子,以下**建立了乙個只包含整數元素的集合物件, 該物件的編碼為intset:

127.0.0.1:6379> sadd numbers 1 3 5

(integer) 3

127.0.0.1:6379> object encoding numbers

"intset"

​ 不過,只要我們向這個只包含整數元素的集合物件新增乙個字串元素, 集合物件的編碼轉移操作就會被執行:

127.0.0.1:6379> sadd numbers "seven"

(integer) 1

127.0.0.1:6379> object encoding numbers

"hashtable"

​ 除此之外, 若我們建立乙個包含了512個整數元素的集合物件, 那麼物件的編碼應該時intset:

127.0.0.1:6379> eval "for i=1, 512 do redis.call('sadd', keys[1], i) end" 1 integers

(nil)

127.0.0.1:6379> scard integers

(integer) 512

127.0.0.1:6379> object encoding integers

"intset"

​ 但是,只要再向集合新增乙個新的整數元素, 使得這個結合的元素變成513, 那麼物件的編碼轉換操作就會被執行:

127.0.0.1:6379> sadd integers 10086

(integer) 1

127.0.0.1:6379> scard integers

(integer) 513

127.0.0.1:6379> object encoding integers

"hashtable"

Redis閱讀筆記 整數集合

整數集合 intset 是集合鍵的底層實現之一,當乙個集合只包含了整數值元素,並且這個集合的元素數量不多時,redis就會使用整數集合作為集合鍵的底層實現。舉個例子,如果建立乙個只包含5個元素的集合鍵,並且集合中的所有元素都是整數值,那麼這個集合鍵的底層實現就會是整數集合 127.0.0.1 637...

Redis閱讀筆記 列表物件

列表物件的編碼可以是ziplist或linkedlist。ziplist編碼的列表物件使用壓縮表作為底層實現,每個壓縮表節點 entry 儲存了乙個列表元素。舉個例子,若我們執行rpush命令,那麼伺服器將建立乙個列表物件作為numbers鍵的值 127.0.0.1 6379 rpush numbe...

redis筆記 有序集合物件

1.有序集合的編碼可以是ziplist或者skiplist 2.當使用ziplist編碼時,每個集合元素使用兩個緊挨在一起的壓縮列表節點來儲存,第乙個節點儲存元素的成員,第二個元素則儲存元素的分值 3.ziplist內的集合元素按分值從小到大進行排序,分值小的元素被放置表頭方向 4.當使用skipl...