1、物件共享:如果redis中已經set了乙個字串或數字,再set同樣值,這時會實現物件引用共享。值物件的refcount會出現變化,增加。
redis> set a 100
ok
redis> set b 100
redis> object refcount a
(integer) 2
object refcount 鍵名可以檢視共享引用的數量
當伺服器考慮將乙個共享物件設定為鍵的值物件時, 程式需要先檢查給定的共享物件和鍵想建立的目標物件是否完全相同, 只有在共享物件和目標物件完全相同的情況下, 程式才會將共享物件用作鍵的值物件, 而乙個共享物件儲存的值越複雜, 驗證共享物件和目標物件是否相同所需的複雜度就會越高, 消耗的 cpu 時間也會越多:
因此, 儘管共享更複雜的物件可以節約更多的記憶體, 但受到 cpu 時間的限制, redis 只對包含整數值的字串物件進行共享。
2、雜湊物件
雜湊物件的編碼可以是ziplist
或者hashtable
。
ziplist
編碼的雜湊物件使用壓縮列表作為底層實現, 每當有新的鍵值對要加入到雜湊物件時, 程式會先將儲存了鍵的壓縮列表節點推入到壓縮列表表尾, 然後再將儲存了值的壓縮列表節點推入到壓縮列表表尾, 因此:
不能滿足這兩個條件的雜湊物件需要使用hashtable
編碼。
注意這兩個條件的上限值是可以修改的, 具體請看配置檔案中關於hash-max-ziplist-value
選項和hash-max-ziplist-entries
選項的說明。
對於使用ziplist
編碼的列表物件來說, 當使用ziplist
編碼所需的兩個條件的任意乙個不能被滿足時, 物件的編碼轉換操作就會被執行: 原本儲存在壓縮列表裡的所有鍵值對都會被轉移並儲存到字典裡面, 物件的編碼也會從ziplist
變為hashtable
3、集合型別
當集合物件可以同時滿足以下兩個條件時, 物件使用intset
編碼:
集合物件儲存的所有元素都是整數值; 集合物件儲存的元素數量不超過512
個;
對於使用intset
編碼的集合物件來說, 當使用intset
編碼所需的兩個條件的任意乙個不能被滿足時, 物件的編碼轉換操作就會被執行: 原本儲存在整數集合中的所有元素都會被轉移並儲存到字典裡面, 並且物件的編碼也會從intset
變為hashtable
。
不能滿足這兩個條件的集合物件需要使用hashtable
編碼。
注意第二個條件的上限值是可以修改的, 具體請看配置檔案中關於set-max-intset-entries
選項的說明。
redis 資料結構與物件
簡單說下redis的資料結構,這些在網上也都有很詳細的解釋,redis 設計與實現 這本書基於redis3.0的,但是現在已經5.0 了,所以有些資料結構發生了變化,其中我自己實現發現了一部分,可能還有沒發現的。慢慢實踐吧 簡單動態字串是在c語音傳統的字串基礎上構建的,其資料結構為 struct s...
Redis資料結構與物件
redis使用五種型別物件實現實現鍵值對資料庫 字串 列表 雜湊 集合 有序集合 列表編碼 ziplist或linkedlist 雜湊編碼 ziplist或hashtable 集合編碼 intset或hashtable 有序集合編碼 ziplist或skiplist struct sdshdr 二進...
Redis設計與實現 資料結構與物件(二)
定義 typedef struct list list 注意,可以返回鍊錶的長度,本質上是乙個雙端鍊錶 相關的api 函式作用 演算法複雜度 listcreate建立新鍊錶 o 1 o 1 listrelease釋放鍊錶,以及該鍊錶所包含的節點 o n o n listdup建立給定鍊錶的副本 o ...