Redis數據結構及實現
05-19
Redis數據結構及實現
推薦閱讀:
來自專欄 Java之鏈
Redis的數據以K-V形式存儲,K和V都是一個對象,每個對象都由結構體redisObject表示。
struct redisObject { unsigned type:4; // 類型 unsigned encoding:4; // 編碼 void * ptr; // 指向底層實現數據結構的指針 ...}
為了節約內存,結構體內使用了位欄位。
對象的type有五種,可根據命令type key獲得
- string
- list
- hash
- set
- zset
coding決定了對象的底層實現,可根據命令object encoding key獲得
- int:long類型整數
- embstr:存儲短字元串。
- raw:簡單動態字元串(SDS),用來存儲長字元串。
- linkedlist:雙向鏈表
- hashtable:由鏈表數組實現
- ziplist:壓縮列表
- intset:(小型)整數集合。由整型數組實現,數組中的元素有序排列,且不重複。
- 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 |