《redis設計與實現》第一版 閱讀筆記(未看完)

2022-09-18 00:03:19 字數 3384 閱讀 7092

一、文件介紹

本文僅作為本人讀書筆記使用,不對其中內容做解釋,記錄以本人可以看懂為標準

該書以簡明的方式主要介紹了redis內部的執行機制,從資料結構到伺服器構造,值得推薦

第一部分  內部資料結構

redis記憶體所使用的資料結構與演算法

一、sds(****** dynamic string) 簡單動態字串

1. sds作用

2. redis中的字串

redis內的字串不僅包含\0結尾的字串,還包含簡單的位元組陣列,還包括其他格式的資料等內容

redi使用sds類替換c語言預設字串考慮到兩點:高效、二進位制安全(程式不對字串裡面儲存的資料進行任何假設)

3. sds實現

typedef char * sds;

struct sdshdr ;

sds 是 char* 的乙個別名

結構體裡包含了三個屬性:len、free、buffer三個屬性

通過len屬性可以o(1)的進行長度計算;通過buf分配額外的空間,並使用free記錄未使用空間的大小,sds可以讓執行追加操作所需的記憶體重分配次數大大減少;在char *實現中,追加只能通過重分配記憶體實現

於此同時對sds的操作必須正確處理len與free屬性

4. 如何減少記憶體重分配次數

建立:當呼叫set命令建立sdshdr時,buf不多申請,剛好給夠所需的,free=0

sds是redis對應的字串表示,sdshdr是對應的儲存型別

二、雙端鍊錶

1. 雙端鍊錶作用

2. 雙端鍊錶的實現

雙端鍊錶是由兩部分組成的,list與listnode

typedef struct list  list;
listnode的value值的型別是void *,方法返回值的型別也是void *,代表對值得型別不做限制

3. 迭代器

typedef struct listiter  listiter;
迭代器內儲存乙個listnode,並且指明迭代的方向

三、字典

1. 字典的作用

redis是乙個鍵值對資料庫,資料庫中的鍵值對由字典儲存,每個資料庫都有乙個字典,這個字典稱為鍵空間(key space),當使用者新增乙個鍵值對到資料庫中時,無論鍵值對是什麼型別,程式就會將該鍵值對新增到鍵空間

hash型別鍵的底層實現除了字典外就是壓縮列表

2. 字典的實現

字典的實現方式有很多種,例如鍊錶與陣列,優點:簡單   缺點:只適用於元素不多的情況

雜湊表,      優點:高效簡單

平衡樹,      優點:穩定,排序操作更高效  缺點:實現更複雜

redis採用雜湊表實現字典,雜湊表的子結構是dictentry

dictentry的實現

/*

* 雜湊表節點

*/typedef struct dictentry v; //union關鍵字 三種中只能包含其中一種

// 鏈往後繼節點

struct dictentry *next;

} dictentry;

dircht(dirc hash table)的實現

/*

* 雜湊表

*/typedef struct dictht dictht;

**table是乙個陣列,俗稱桶(bucket),每乙個值對應乙個dictentry結構的指標

size代表陣列大小,sizemask意思不清楚,used就是雜湊表現有的鍵的數量

字典的定義

/*

* 字典

* * 每個字典使用兩個雜湊表,用於實現漸進式 rehash

*/typedef struct dict dict;

字典的實現使用了兩個hash table,0號雜湊表是字典主要使用的雜湊表,1號雜湊表只有當程式對0號雜湊表進行rehash的時候才會使用

rehash:當鍵非常多,遠大於table陣列長度時,陣列內的每個值將退化成一條鏈,hash table的優勢將不復存在,於是需要進行rehash操作,對hash table進行擴容,將比率盡量維持在1:1左右

rehash觸發的條件有兩種:1. 鍵與陣列長度比率ratio>=1 && dict_can_resize為真

2. ratio>=dict_force_resize_ratio dict_force_resize_ratio是強制改變大小的比率

當資料庫執行後台持久化任務時,為了最大化利用系統的copy on write機制,程式會暫時將dict_can_resize置為假,避免執行自然resize,總而言之就是為了效率

4. 字典的收縮

與rehash相反

收縮操作是程式手動執行的,擴充套件操作是自動執行的,收縮程式決定填充率是多少的時候來執行收縮程式

對雜湊表的擴充套件和收縮都是分多次、漸進式的進行的

四、跳躍表

跳躍表是乙個有層次的鍊錶,增刪改查的時間複雜度都是o(logn)

跳躍表解釋: 

2019-03-07  11:13:52  有時間再看吧 得有輸出才行啊 幹點活吧

1. 跳躍表的實現

跳躍表的實現

typedef struct zskiplist  zskiplist;
跳躍表節點(層)的實現

typedef struct zskiplistnode  level;

} zskiplistnode;

q&a:

為什麼redis要使用c而不是c++的stl容器?

猜想:可能是基於記憶體或者效率的考慮吧

sds如何實現二進位制安全的?

跳躍表與平衡樹比較?

Rss 閱讀器第一版完成

無聊弄了乙個rss閱讀。很簡單 功能還是單一,希望可以努力完善這個程式 功能目前支援的功能 視窗拖動 關閉,縮小 自定義圖示 連線其他rss閱讀 目前支援單標籤功能 showflexchrome false alwaysinfront true width 500 height 500 view.c...

Rss 閱讀器第一版完成

無聊弄了乙個rss閱讀。很簡單 功能還是單一,希望可以努力完善這個程式 功能目前支援的功能 視窗拖動 關閉,縮小 自定義圖示 連線其他rss閱讀 目前支援單標籤功能 showflexchrome false alwaysinfront true width 500 height 500 view.c...

第一版Python程式

coding cp936 import os import cpickle as p class person def init self,name,age,self.name name self.age age self.def str self return name self.name age...