redis內部資料結構總結(7)intset

2021-07-26 20:09:45 字數 1052 閱讀 3452

redis裡面使用intset是為了實現集合(set)這種對外的資料結構。set結構類似於數學上的集合的概念,它包含的元素無序,且不能重複。redis裡的set結構還實現了基礎的集合並、交、差的操作。與redis對外暴露的其它資料結構類似,set的底層實現,隨著元素型別是否是整型以及新增的元素的數目多少,而有所變化。概括來講,當set中新增的元素都是整型且元素數目較少時,set使用intset作為底層資料結構,否則,set使用dict作為底層資料結構。

便於在上面進行二分查詢,用於快速地判斷乙個元素是否屬於這個集合。它在記憶體分配上與ziplist有些類似,是連續的一整塊記憶體空間,而且對於大整數和小整數(按絕對值)採取了不同的編碼,盡量對記憶體的使用進行了優化。

set-max-intset-entries 512

intset與ziplist相比:

ziplist可以儲存任意二進位制串,而intset只能儲存整數。

ziplist是無序的,而intset是從小到大有序的。因此,在ziplist上查詢只能遍歷,而在intset上可以進行二分查詢,效能更高。

ziplist可以對每個資料項進行不同的變長編碼(每個資料項前面都有資料長度欄位len),而intset只能整體使用乙個統一的編碼(encoding)。

我們前面提到過,set的底層實現,隨著元素型別是否是整型以及新增的元素的數目多少,而有所變化。

dict是乙個用於維護key和value對映關係的資料結構,那麼當set底層用dict表示的時候,它的key和value分別是什麼呢?實際上,key就是要新增的集合元素,而value是null。

對於小集合使用intset來儲存,主要的原因是節省記憶體。特別是當儲存的元素個數較少的時候,dict所帶來的記憶體開銷要大得多(包含兩個雜湊表、鍊錶指標以及大量的其它元資料)。所以,當儲存大量的小集合而且集合元素都是數字的時候,用intset能節省下一筆可觀的記憶體空間。

實際上,從時間複雜度上比較,intset的平均情況是沒有dict效能高的。以查詢為例,intset是o(log n)的,而dict可以認為是o(1)的。但是,由於使用intset的時候集合元素個數比較少,所以這個影響不大。

redis內部資料結構的資料結構

redis對外的公眾的資料結構有五種string,list,set,hash,zset 編碼常量 編碼所對應的底層資料結構 redis encoding int long 型別的整數 redis encoding embstr embstr 編碼的簡單動態字串 redis encoding raw ...

Redis內部資料結構總結(5)skiplist

redis的sorted set 底層是由skiplist,dict,ziplist來實現的。在reids.config中有兩個配置 zset max ziplist entries 128 zset max ziplist value 64 sorted set是乙個有序集合,當資料較少時,sor...

Redis內部資料結構總結(2)dict

dict是redis乙個非常重要的基礎資料結構,dict用來維護key和value對映關係的資料結構,與很多語言中的map或者dictionary類似。redis的乙個database中所有key到value的對映,就是乙個dict來維護的。另外,當redis中的hash結構資料較多時,hash的底...