Redis 集合物件

2022-07-08 10:00:21 字數 2100 閱讀 4404

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

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

舉個例子, 以下**將建立乙個如圖 8-12 所示的intset編碼集合物件:

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

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

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

集合物件儲存的所有元素都是整數值;

集合物件儲存的元素數量不超過512個;

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

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

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

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

redis> sadd numbers 135

(integer)

3redis>object encoding numbers

"intset

"

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

redis> sadd numbers "

seven

"(integer)

1redis>object encoding numbers

"hashtable

"

除此之外, 如果我們建立乙個包含512個整數元素的集合物件, 那麼物件的編碼應該會是intset

redis> eval "

for i=1, 512 do redis.call('sadd', keys[1], i) end"1

integers

(nil)

redis>scard integers

(integer)

512redis>object encoding integers

"intset

"

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

《Redis 集合物件》

一 概述 redis 原始碼版本為3.0.0.redis 集合命令請戳。object encoding key 檢視資料底層型別實現。二 集合物件的底層實現 編碼方式 字串物件共有兩種編碼方式intset 整數集合 hashtable 字典 編碼方式的選擇 當列表物件 元素都是整數 元素數量小於51...

Redis 雜湊物件和集合物件

雜湊物件編碼實現為ziplist或hashtable ziplist ziplist作為雜湊物件底層實現時,當有新兼職加入雜湊物件,則會儲存鍵的列表節點放到表尾,再兌入值得列表節點。即儲存同一鍵值對節點總是相鄰,儲存鍵的節點在前,儲存值的節點在後。先新增到雜湊物件中的鍵值對會放在列表表尾。使用zip...

11 Redis 集合物件

本文內容均來自 redis設計與實現 一書 集合物件的編碼可以是intset或者hashtable。intset編碼的集合物件使用整數集合作為底層實現,集合物件包含的所有元素都被儲存在整數集合裡面。hashtable編碼的集合物件使用字典作為底層實現,字典的每個鍵都是乙個字串物件,每個字串物件包含了...