集合物件的編碼可以是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編碼的集合物件使用字典作為底層實現,字典的每個鍵都是乙個字串物件,每個字串物件包含了...