Redis設計實現 學習筆記

2022-09-19 15:15:12 字數 1850 閱讀 8611

最近在準備面試,問到redis相關知識,只能說個皮毛,說的既不深入也不全面,所以抓緊突擊一下,先學《redis設計與實現》。

選擇看書的原因是:

書中全面深入,且能出書一定十分用心;

搜部落格也找不到比書更全面的文章,且費時;

直接看原始碼乙個是對c掌握不好,且易困,效率不高,所以跟著書同步學原始碼,是我認為現在最好的選擇。

redis做了乙個用作字串的sds,除了一些不需要修改的場景,都是用sds

c字串的底層實現總是一 個n+1個字元長的陣列

sds.h:

struct

sdshdr ;

c字串與sds區別

1c字串

sds2

求長度,需要遍歷o(n)

直接取len就可以o(1)

3容易造成緩衝區溢位

4減少了記憶體重新分配次數

(速度要求嚴苛,避免分配記憶體耗時多)

5二進位制安全

4:sds有free,可以比c字串多一些預留空間。空間優化策略主要有兩種:

redis自己構建的鍊錶:

/*

* 雙端鍊錶節點 */

typedef

struct

listnode listnode;

/*

* 雙端鍊錶迭代器 */

typedef

struct

listiter listiter;

/*

* 雙端鍊錶結構 */

typedef

struct

list list;

也叫:符號表、關聯陣列、對映,用於儲存鍵值對;

/*

* 字典 */

理解:雜湊表使用鏈位址法來解決鍵衝突:

雜湊表節點dictentry的指標構成乙個鏈,hash相同的就排在當前dictentry的next

1.為ht[1]分配空間,與ht[0]比較,擴容則分配

//

新雜湊表的大小至少是目前已使用節點數的兩倍 //

t = o(n)

return dictexpand(d,d->ht[0].used*2);

收縮則分配大小等於ht[0]的?

/*

* 縮小給定字典

* 讓它的已用節點數和字典大小之間的比率接近 1:1

* 返回 dict_err 表示字典已經在 rehash ,或者 dict_can_resize 為假。

* 成功建立體積更小的 ht[1] ,可以開始 resize 時,返回 dict_ok。 */

int dictresize(dict *d)

2.把ht[0]複製並重新hash計算到ht[1]上

3.把ht[0]釋放,ht[1]設定為ht[0]。

雜湊表會自動在表的大小的二次方之間進行調整。

在沒有bgs**e或bgrewriteaof命令時,負載因子大於1;或者有bgs**e或bgrewriteaof命令時,負載因子大於5;時執行

負載因子= 已儲存/雜湊表大小

skiplist 

todo11

1111

1111

1

《Redis設計與實現》學習筆記 Lua指令碼

redis從2.6開始支援lua指令碼,和事務的功能類似,可以通過lua指令碼原子的執行多個redis命令。redis提供了eval和evalsha命令執行lua指令碼。redis在伺服器內嵌了乙個lua壞境,並進行了一系列的修改,從而確保這個lua壞境可以滿足redis伺服器的需要,通過下列步驟建...

Linux設計與實現學習筆記

從第三章開始吧,前面都是overview的介紹 第三章 程序管理 程序的概念 處於執行期的程式 其他占用的資源 開啟的檔案,掛起的訊號.linux中線程是一種特殊的程序,區別於其他系統。fork exec exit 程序描述符及任務結構 每個程序對應乙個資料結構 task struct,稱為程序描述...

《Redis設計與實現》學習筆記 單機資料庫

乙個redis伺服器例項在單機執行時可以新增多個資料庫來儲存鍵值對,redis在實現中通過乙個redisdb結構體來描述資料庫,該結構體中有乙個字典型別的字段來儲存資料庫中所有的鍵值對,redisserver結構體來描述伺服器例項,該結構體中有乙個dbnum欄位來儲存資料庫數量,乙個redisdb陣...