redis 資料結構 簡單動態字串和鍊錶

2021-08-16 01:26:35 字數 1089 閱讀 3384

假期在家,看了《redis 設計與實現》,將其整理成了md。

想來,有兩個月左右沒有寫部落格了,將筆記作為乙個系列更上來

鍊錶

struct sdshdr
buf採用和c中表示string一樣的表示方法,即以』\0』結尾,這樣可以復用部分c的string函式,

在len和free的計數中,並不包含』\0』,也就是說,設buf的大小為10,若有字串」li qiang\0」,len=8,free=1;

當儲存的資料(len)小於1mb時,預分配的空間(free),與len相等,這時,buf的大小=2*len+1byte=2*free+1byte=len+free+1byte.(+1是因為\0存在)

當儲存的資料(len)大於等於1mb時,預分配的空間(free)為1mb,這時,buf的大小為,len+free+1byte

避免重複的申請、刪除記憶體空間:buf的使用可以通過len和free進一步控制,可以降低對記憶體的申請,記憶體操作是核心指令,較為耗費效能

因為減少了記憶體操作,有進一步的封裝,進而可以避免一些可以造成記憶體洩漏問題的操作

在結構體內還是用了char的陣列,還可以復用一部分string的方法

可以在o(1)的複雜度內獲取一些常用的資訊

二進位制安全:c的string會把』\0』輸入結束的標誌,這樣,對於長文字和位元組資料,儲存會有問題,而使用sds的leh和buf,可以確認buf的真正結束在**,進而可以儲存任何資料的二進位制位元組表示

基本所有用於表示可能修改的字串的地方都是sds,c的字串只用來表示一些不必修改的資料,比如日誌

redis的鍊錶是雙向鍊錶,並且,在使用鍊錶節點串起鍊錶之餘,redis還是用了乙個list的結構體,內部儲存鍊錶head,tail和刪除,比較,複製鍊錶節點的方法,以及節點個數.

typedef

struct listnode

typedef

struct

list

value為void型別,意味可儲存任何型別

甚多,列表的儲存,訂閱與發布功能的實現,慢查詢,監視器

Redis 資料結構 簡單動態字串

redis 是基於 c 語言的記憶體資料庫,但是 redis 中並沒有使用 c 語言的字串 實質是 以空格結尾的字元陣列 作為預設的字串,而是自己構建了一種名為簡單動態字串 dynamic string 的抽象資料結構,將其用作預設的字串表示。通常而言,sds 在 redis 中被用於 1.預設的字...

Redis資料結構 SDS(簡單動態字串)

redis中所有字串都是用sds 簡單動態字串 實現的,該結構體內部定義如下 struct sdshdr 關於sds的特點,可以總結為以下幾點 1.sds遵循c字串以空字元結尾的風格,相容部分c字串函式,buf在末尾缺省會帶上乙個 0 字元,但是不會計算到len欄位裡面,因此buf的實際大小為len...

Redis資料結構 簡單的動態字串

c語言中的字串是基於陣列來實現的,每個字串會多出乙個空字元 redis中的簡單動態字串是sds dynamic string 型別 sds遵循c語言中以空字元為結尾的慣例是為了利用c語言函式庫中的某些字串函式,而且新增空字元的這乙個操作是有sds函式自動完成的。redis採用sds的原因是為了滿足字...