標籤:

Redis數據結構及實現

Redis數據結構及實現

來自專欄 Java之鏈

Redis的數據以K-V形式存儲,K和V都是一個對象,每個對象都由結構體redisObject表示。

struct redisObject { unsigned type:4; // 類型 unsigned encoding:4; // 編碼 void * ptr; // 指向底層實現數據結構的指針 ...}

為了節約內存,結構體內使用了位欄位。

對象的type有五種,可根據命令type key獲得

  1. string
  2. list
  3. hash
  4. set
  5. zset

coding決定了對象的底層實現,可根據命令object encoding key獲得

  1. int:long類型整數
  2. embstr:存儲短字元串。
  3. raw:簡單動態字元串(SDS),用來存儲長字元串。
  4. linkedlist:雙向鏈表
  5. hashtable:由鏈表數組實現
  6. ziplist:壓縮列表
  7. intset:(小型)整數集合。由整型數組實現,數組中的元素有序排列,且不重複。
  8. skiplist:跳錶

需要注意的是redis的數據結構是動態類型,其底層實現可能會發生變化。

  • string(string是五種類型中唯一一種會被其他四種對象嵌套的類型
    • int:存儲long類型的整數
    • embstr:字元串長度小於等於39位元組,或者double浮點數
    • raw: 字元串長度大於39位元組,或者long和double無法存儲的數字
  • list
    • ziplist:元素數量小於512,且每個字元串長度小於64
    • linkedlist:不滿足上述條件
  • hash
    • ziplist:K-V數量小於512,且K和V的字元串長度小於64
    • hashtable:不滿足上述條件
  • set
    • intset:集合中元素數量小於512,且所有元素都是整數
    • hashtable:不滿足上述條件
  • zset
    • ziplist:有序集合元素數量小於128,且所有元素的長度小於64
    • skiplist & hashtable:不滿足上述條件

本地做一個簡單的測試:

可以看到2^64-1和2^64的底層實現是不一樣的,兩者都不能進行incr操作,一個會溢出,一個不是不能進行整數操作。


推薦閱讀:

Redis有序集合
消息隊列的作用
緩存淘汰演算法--LRU演算法
Spring+SpringMVC+Redis
Redis 複製

TAG:Redis |