Redis底層資料結構

2021-10-24 03:24:44 字數 1113 閱讀 9871

redis:開源,c語言編寫的key-value資料庫

字串:redis中的字串並沒有直接使用c語言傳統的字串表示,而是自己構建了一種名為簡單動態字串(****** dynamic string sds)的抽象型別,並且將sds作為redis的預設字串表示,c字串和sds的區別:

c 字串

sds獲取字串長度的複雜度為o(n)

獲取字串長度的複雜度為o(1)

api 是不安全的,可能會造成緩衝區溢位

api 是安全的,不會造成緩衝區溢位

修改字串長度n次必然需要執行n次記憶體重分配

修改字串長度n次最多執行n次記憶體重分配

只能儲存文字資料

可以儲存二進位制資料和文本文資料

雙端:鍊錶節點帶有prev 和next 指標,獲取某個節點的前置節點和後置節點的時間複雜度都是o(n)

無環:表頭節點的 prev 指標和表尾節點的next 都指向null,對立案表的訪問時以null為截止

表頭和表尾:因為鍊錶帶有head指標和tail 指標,程式獲取煉表頭結點和尾節點的時間複雜度為o(1)

長度計數器:鍊錶中存有記錄鍊錶長度的屬性 len

多型:鍊錶節點使用 void* 指標來儲存節點值,並且可以通過list 結構的dup 、 free、 match三個屬性為節點值設定型別特定函式。

跳躍表:跳躍表是一種有序資料結構,通過在每個節點維持多個指向其他節點的指標,從而達到快速訪問節點的目的。

層:跳躍表節點的層資訊,儲存在level陣列中,陣列的size範圍為1-32。一般層數越多,訪問其他節點的速度越快。

前進指標:指向表尾方向的下乙個節點,如上圖指向右方箭頭所示,用於從表頭向表尾訪問節點。(遍歷操作)

跨度:用於記錄兩個節點的距離,如上圖箭頭上的的數字所示,指向null的指標的跨度為0,用於計算排位(排位:查詢某個節點時,沿途的所有層的跨度之和)。

後退指標:用於從表尾向表頭方向訪問節點,每次只能後退至前乙個節點。

分值:用於節點的排序,節點按照分值從小到大排序。

成員物件:是乙個指向字串物件的指標,用於儲存物件。(只用於儲存字串)。

注意:各節點的成員物件必須是惟一的,但是分值可以相同。分值相同的節點按照成員物件在字典序中的大小排序(從小到大)。

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設計了一種簡單的動態字串 可以根據不同的資料型別不同的資料結構選擇不同的資料結構 支援的資料型別 字串...