Redis資料結構與物件

2021-09-25 04:34:41 字數 1963 閱讀 1117

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...