Redis底層資料結構筆記

2022-10-10 22:18:27 字數 2024 閱讀 3955

//跳躍表

typedef struct zskiplist zskiplist;

typedef struct zskiplistnode level;    

//後退節點

struct zskiplistnode *backward;

//分值

double score;

//成員物件,是乙個 sds

屬性型別

長度說明

zlbytes

uint32_t

4b整個壓縮列表占用的記憶體位元組數(對列表進行記憶體重分配或者極計算 zlend 時會用到)

zltail

uint32_t

4b表尾節點(是節點不是 zlend 的位置)距離起始位址的位元組數

zllen

uint16_t

2b壓縮列表的節點數量

entry

列表節點(位元組陣列或者整數)

不定壓縮列表的節點

zlend

uint8_t

1b0xff , 用來標記壓縮列表末端

根據例子,zltail是最後乙個節點的起始位址的偏移值。zlbytes-zltail-1就是最後乙個節點的長度(zlend佔乙個位元組)

1、previous_entry_length:記錄前面乙個節點所占用的位元組數,這個可以用於後序遍歷。上面說了可以根據zltail 計算出最後乙個節點的起始位置,減去這個值就正好是前面乙個結點的起始位置,依次,可以進行後序遍歷。這個屬性可以是1或5位元組長度,如果前乙個entry長度小於254位元組,就使1位元組,否則5位元組。

2、encoding:記錄 content 屬性儲存的資料的型別以及長度。可以是 1、2、5 位元組長,具體規則比較繁瑣。

3、儲存節點的值,可以是乙個整數或者位元組陣列。

如果連續的多個節點(e1,e2,e3...),他們的長度都在 250~253 之間,現在在這些節點之前新增乙個長度大於 254 的節點,那麼 e1 的 previous_entry_length 屬性就不得不變為 5 個位元組,那麼 e1 的長度就也會超過 254 位元組,e2 的 previous_entry_length 屬性也會變為 5 位元組,...以此類推,引起連鎖更新 。同樣,刪除節點也可能會引發連鎖更新。

實際上這種情況比較少見,很少連續很多節點的長度在這個區間之內,對少量節點的更新也不會浪費太長時間,這種資料結構可以節省記憶體

Redis底層資料結構?

福哥口訣法 簡鏈字跳整 壓快壓 sds synamic string 簡單動態字串。支援自動動態擴容的位元組陣列 list 鍊錶 雙端鍊錶。dict 字典。使用雙雜湊表實現的,支援平滑擴容的字典 zskiplist 跳躍表。附加了後向指標的跳躍表 intset 整數集合。用於儲存整數數值集合的自有結...

Redis底層資料結構

redis底層實現的8種資料結構 sds synamic string 支援自動動態擴容的位元組陣列 list 鍊錶 dict 使用雙雜湊表實現的,支援平滑擴容的字典 zskiplist 附加了後向指標的跳躍表 intset 用於儲存整數數值集合的自有結構 ziplist 一種實現上類似於tlv,但...

redis底層資料結構

1.1 string字串 表現形式為 資料結構 sds 簡單的動態字串 使用原因 redis是使用c語言開發的,但在c語言中是沒有字串型別的,只能使用指標或符陣列的形式表示乙個字串,所以在redis設計了一種簡單的動態字串 可以根據不同的資料型別不同的資料結構選擇不同的資料結構 支援的資料型別 字串...