Redis的設計與原理 一

2021-09-24 16:17:19 字數 1108 閱讀 2896

本章講解的是redis當初設計的資料結構和內部物件的知識點

1.動態字串:

雖然redis使用的是ansi c所編寫但是內部使用的字串並沒有使用c中的字串,而是使用了一種名為簡單動態字串(****** dynarmic string,sds)的抽象型別作為它的預設字串型別

struct sdshdr
sds就是上面這種結構,比如我們存乙個redis字串,那麼在陣列中儲存的分別是『r』,『e』,『d』,『i』,『s』五個字元,但是其中最後乙個位元組保留了空字元『\0』,相信學習過c語言的同學肯定都知道為什麼,那我就不細說了。

c中字串不能滿足redis對字串在安全性,效率以及功能這方面的要求,因此使用了sds這種字串結構。

1.1 常數獲取字串長度

不細說了,結構中有乙個len屬性可以直接獲取。

1.2 杜絕快取區溢位

因為c字串不記錄自身長度帶來的乙個問題就是容易造成緩衝區溢位,但是使用了sds字串後,我們完全杜絕了發生緩衝區溢位的可能性:當sds api需要對sds進行修改的時候,api會檢查sds的空間是否符合執行所需的大小,所以也就不會出現緩衝區溢位的情況了。如果長度不夠會先進行擴充套件後再進行拼接。

1.3 減少修改字串時帶來的記憶體重分配次數

詳細講解起來比較麻煩我簡單的說一下redis是如何做的。

空間預分配

比如a字串長度為n1,b字串長度為n2,那麼當需要相加的時候我們為其進行一次分配,直接將長度擴容為n1+n2+1的長度,如果這時再有c字串長度n3需要替換b字串,如果b字串長度大於c字串那麼容器長度不變,但是free屬性資料會進行改變。

惰性空間釋放

就是擴容後不會回縮,哪怕資料沒有填滿也會保持擴容後的長度,但是我們擁有api可以進行修改。

1.4 二進位制安全

這個就不細說了,有興趣的自己去看看。

1.5相容部分c字串函式

遵循c字串以空字元結尾的慣例可以幫助sds可以重用庫定義的函式。

Redis的設計與原理(六)

redis並沒有直接使用這些資料結構來實現鍵值對資料庫,而是基於這些資料結構建立了乙個物件系統,這個物件系統包含字串物件,列表物件,雜湊物件,集合物件和有序集合物件這五種型別的物件,每種物件都用到了至少一種我們前面所介紹的資料結構。通過這五種不同型別的物件,redis可以在執行命令之前,根據物件的型...

Redis的設計與原理(七)

本章將會寫單獨乙個redis資料的實現,比如伺服器儲存資料庫的方法,客戶端切換資料的方法,資料庫儲存鍵值對的方法,以及針對資料庫的新增,刪除,檢視,更新操作的實現方法等。在初始化伺服器時,程式會根據伺服器狀態的dbnum屬性來決定應該決定應該建立多少個資料庫 預設情況下,該選項的值為16,所以red...

Redis設計與實現(一)

redis是一種現在挺火的一種nosql資料庫,它一般被用作快取。比如我們可以在redis客戶端敲 redis set msg helloredis 那麼就會在redis資料庫中建立乙個新的鍵值對,keg是msg,value是helloredis,兩個都是sds。又比如在redis客戶端敲 redi...