Redis底層數據結構的映射關係

閱讀文本大概需要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。

往期精彩

01 漫談發版哪些事,好課程推薦

02 Linux的常用最危險的命令

03 互聯網支付系統整體架構詳解

04 優秀的Java程序員必須瞭解的GC哪些

05 IT大企業有哪些病,別被這些病毀了自己?

關注我每天進步一點點

你點的在看,我都當成了喜歡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章