最近學習看黃健巨集先生寫的《redis設計與實現》,開篇即介紹了redis的基礎資料結構和資料物件,看了一遍後覺得還是有點沒弄明白相互之間的關係,覺得很有必要整理一下自己的思緒。
列表物件 雜湊物件 集合物件 有序集合物件 簡單動態字串實際是對c語言char*的封裝,redis實現於在sds.h中,類似於c++的string,以及stl的vector。是一種常用的封裝。它是用如下的資料結構。struct sdshdr ;
任何一本資料結構的書上都會有關於單鏈表的詳細介紹,雙鏈表就是在單鏈表的基礎上增加了乙個指向前驅的指標。redis實現於adlist.h
typedef
struct listnode listnode;
typedef
struct
list list;
3.3.1雜湊表的資料結構typedef
struct dictentry v;
struct dictentry *next; // 指向下個雜湊表節點,形成鍊錶redis使用鏈位址法處理雜湊碰撞,
//故在每乙個節點中都存在乙個指向下乙個節點的雜湊表節點的指標。
} dictentry;
typedef
struct dictht dictht;
redis使用murmurhash2演算法來計算鍵的雜湊值。該演算法於2023年發明,詳細介紹檢視該演算法的官網。
3.3.2 字典的資料結構。
typedef
struct dict dict;
我們可以看到每個字典中包含了兩個雜湊表,一般情況下我們只是用ht[0],此時rehashidx為-1。當雜湊表中元素增多,used接近於雜湊表的大小時,需要對雜湊表進行擴容。此時為rehash,redis使用一種漸進式rehash策略,即每次查詢或者插入操作時,判斷是否正在進行rehash,若正在進行,則轉移部分ht[0]中的元素到ht[1]中,這樣可以將轉移操作分布到各次操作中,不會阻塞很長時間。當轉移完成後,ht[1]賦值給ht[0],恢復rehashidx為-1;查詢元素時,根據是否正在進行rehash,判斷是否需要查詢ht[2]。
跳躍表是比較少見的一種資料結構,redis中用於兩個地方,有序集合鍵和集群內部資料結構。下圖是跳躍表的示例圖(來自維基百科)。
網上也有很多跳躍表的說明,就不細說跳躍表了。
intset是集合鍵的底層實現之一,其資料結構定義在intset.h中。
typedef struct intset intset;
其中encoding編碼方式intset_enc_int16 ,intset_enc_int32,intset_enc_int64
從以上的資料結構定義可以很清楚的看出,不管使用哪種哪種編碼,intset都是將資料序列化到contents中。當資料元素全是intset_enc_int16 型別時,可以使用較少的儲存空間,但是當插入乙個intset_enc_int32 型別是就需要公升級了。
壓縮列表是列表鍵和雜湊鍵的底層實現之一。在記憶體中開闢一塊連續的儲存單元。
非空 ziplist在記憶體中如下儲存。第一排代表所佔位元組,第二排代表記憶體中資料。44
2???
?2zlbytes
zltail
zlen
entry1
entry2
…entryn
zlend
資料物件定義在redis.h中。type表示型別,encoding表示編碼方式。
typedef
struct redisobject robj;
Redis 基礎資料結構
基礎資料型別 5種 string 字串 hash 雜湊 list 列表 set 集合 zset 有序集合 set key name value 命令用於設定給定key的值,如果key已經儲存其它值,則會覆蓋舊值,且與型別無關 get key name 命令用於獲取指定key的值,如果key不存在,則...
Redis 基礎資料結構
redis有5種基礎資料結構,分別是 string list hash set zset。1 string 字串 字串string是redis最簡單的資料結構,內部表示的就是乙個字元陣列。儲存值 set key value 獲取值 get key redis可以對多個字串進行批量讀寫。批量儲存 ms...
Redis 基礎資料結構(一)
前言 redis 有5種基礎資料結構,分別是string 字串 list 列表 hash 字典 set 集合 zset 有序集合 而redis所有的資料結構都有乙個唯一的key字串作為名稱。然後通過這個唯一的key來獲取相應的value,不同資料結構的差異在於value對應底層的資料結構不同。對re...