閱讀文本大概需要3分鐘。
Redis有五種基本數據結構:字符串、hash、set、zset、list。但是你知道構成這五種結構的底層數據結構是怎樣的嗎?
0x01:Redis底層八種數據結構
簡單動態字符串 SDS (simple synamic string):支持自動動態擴容的字節數組
鏈表 list :鏈表
字典 dict :使用雙哈希表實現的, 支持平滑擴容的字典
跳躍表 zskiplist :附加了後向指針的跳躍表
整數集合 intset :用於存儲整數數值集合的自有結構
壓縮列表 ziplist :一種實現上類似於TLV, 但比TLV複雜的, 用於存儲任意數據的有序序列的數據結構
quicklist:一種以ziplist作爲結點的雙鏈表結構, 實現的非常不錯
zipmap :一種用於在小規模場合使用的輕量級字典結構
0x02:Redis五種存儲類型與底層八數據結構的映射關係
Redis五種存儲類型與八種數據結構的橋樑, 是redisObject;Redis中的Key與Value在表層都是一個redisObject實例, 所以該結構有所謂的"類型", 即是ValueType.。對於每一種Value Type類型的redisObject;其底層至少支持兩種不同的底層數據結構來實現。
來自《Redis設計與實現第二版》
字符串
字符串類型對應Redis底層三種數據結構,分表是int、raw和embstr。
(a)當Value是數字的時候,對應int
(b)當字符串長度比較短(長度不大於39字節)時,對應embstr
(c)當字符串長度比較長(長度大於39字節)時,對應raw
其中embstr和raw都是由SDS動態字符串構成的。唯一區別是:raw是分配內存的時候,redisobject和 sds 各分配一塊內存,而embstr是redisobject和raw在一塊兒內存中。
列表
(a)列表對象所有字符串元素長度都小於64字節或者元素數量小於512時,對應ziplist
(b)不滿足ziplist條件的其他情況,對應list 雙向量表
hash
(a)元素數量小於512或者所有元素長度小於64字節時,對應ziplist 縮列表
(b)不滿足ziplist條件的其他情況,對應dic 字典(也就是哈希表)
set
(a)所有元素都是整數或者元素數量小於512時,對應整數集合 inset
(b)不滿足inset條件的其他情況,對應dic 字典(也就是哈希表)
zset
(a)元素數量小於128或者所有元素長度小於64字節,對應ziplist 壓縮列表
(b)不滿足ziplist條件的其他情況,對應跳躍表 zskiplist
最後介紹一個命令來顯示五種數據類型的底層數據結構
OBJECT ENCODING key
上面的命令給string 數據類型 k1賦值str,給 k2賦值123,通過 OBJECT ENCODING 命令,顯示底層實現的數據類型分別是 embstr 和 int。
☆
往期精彩
☆
關注我每天進步一點點
你點的在看,我都當成了喜歡