redis使用五種型別物件實現實現鍵值對資料庫:字串、列表、雜湊、集合、有序集合
列表編碼 ziplist或linkedlist
雜湊編碼 ziplist或hashtable
集合編碼 intset或hashtable
有序集合編碼 ziplist或skiplist
struct sdshdr
;
二進位制安全
相容部分c字串函式
節點結構
typedef
struct listnode listnode;
持有結構
typedef
struct list list;
typedef
struct dictht dictht;
雜湊表節點
typedef
struct dictentry v;
struct dictentry *next;
// 解決衝突
}dictentry;
字典
typedef
struct dict dict;
type是乙個指向dicttype結構的指標,每個dicttype結構儲存了一簇用於操作特定型別鍵值對的函式,redis會為用途不同的字典設定不同的型別特定函式。
typedef
struct dicttype dicttype;
# 使用字典設定的雜湊函式,計算鍵key的雜湊值
hash = dict->type->hashfunction(key);
# 使用雜湊表的sizemask屬性和雜湊值,計算出索引值
# 根據情況不同,ht[x] 可以是 ht[0] 或 ht[1]
index = hash & dict->ht[x].sizemask
redis使用murmurhash2演算法來計算鍵的雜湊值
redis使用開鏈法(separate chaining)來解決位址衝突
擴充套件或收縮雜湊表時進行
擴充套件條件:
收縮條件:
雜湊表負載因子小於0.1
步驟:為ht[1]分配空間
將rehashidx設為0
rehash期間,每次對字典執行新增、刪除、查詢或更新操作時,程式除了執行指定操作外,還會順帶將ht[0]中rehashidx索引上的所有鍵值對rehash到ht[1],當rehash工作完成之後,程式將rehashidx屬性的值增1。(單次rehash)
隨著字典操作的不斷執行,最終在某個時間點上,ht[0]的所有鍵值對都會被rehash至ht[1],這時程式將rehashidx屬性值設為-1,rehash完成。
rehash期間,字典的刪、改、查會在兩個雜湊表上進行。新新增到字典的鍵值對一律儲存到ht[1],保證ht[0]包含的鍵值對數量只會減少不會增加
typedef
struct intset intset;
一系列特殊編碼的連續記憶體塊組成的順序型(sequential)資料結構
組成:
zlbytes
zltail
zllen
entry1
entry2
…entryn
zlend
zlbytes: 占用記憶體位元組數。4位元組
zltail: 表尾節點(entryn)距壓縮列表起點偏移。4位元組
zllen: 節點數量。2位元組
entryx: 節點。不定
zlend: 標記列表末端,1位元組,為0xff
redis 資料結構與物件
簡單說下redis的資料結構,這些在網上也都有很詳細的解釋,redis 設計與實現 這本書基於redis3.0的,但是現在已經5.0 了,所以有些資料結構發生了變化,其中我自己實現發現了一部分,可能還有沒發現的。慢慢實踐吧 簡單動態字串是在c語音傳統的字串基礎上構建的,其資料結構為 struct s...
Redis資料結構與物件(二)
1 物件共享 如果redis中已經set了乙個字串或數字,再set同樣值,這時會實現物件引用共享。值物件的refcount會出現變化,增加。redis set a 100 ok redis set b 100 redis object refcount a integer 2 object refc...
重現Redis 資料結構與物件(三)
整數集合 intset 是集合鍵的底層實現之一,當乙個集合只有整數值元素且元素不多時,redis使用整數集合作為集合鍵的底層實現。定義和實現分別在intset.h和intset.c中。typedef struct intset intset redis可以儲存的整數值型別為int16 t,int32...