Redis 學習筆記 資料結構(2)

2021-10-03 07:12:58 字數 2038 閱讀 2322

跳躍表(skiplist)

跳躍表的實現

typedef

struct zskiplist zskiplist;

typedef

struct zskiplistnode level;

//後退指標

struct zskiplistnode *backward;

//分值

double score;

//成員物件

obj *obj;

} zskiplistnode;

展示圖:總結

1.跳躍表是有序集合的底層實現之一。

2.rcdis的 跳 躍 表 實 現 由zskiplist和zskiplistnode兩 個 結 構 組 成 , 其 中zskiplist用p保 存 跳 躍 表 信 息 ( 比 如 表 頭 節 點 、 表 尾 節 點 、 長 度 而zskiplistnode則 用p表 示跳躍表節點。

3.每個跳躍表節點的層卨都是1至32之間的隨機數。

4.在同乙個跳躍表中,多個節點可以包含相同的分值,但每個節點的成員物件必須是 唯一的。

5.跳躍表中的節點按照分值大小進行排序,當分值相同時,節點按照成員物件的大小進行排序。

整數集合

集合鍵的底層實現之一,當乙個集合只包含整數值元素時,並且整個集合的元素數量不多時,就會使用該資料結構作為集合鍵的底層實現。

整數集合的實現

typedef

struct intset intset;

contents陣列是整數集合的底層實現:整數集合的每個元素都是contents陣列的-乙個陣列項( item),各個項在陣列中按值的大小從小到大有序地排列,並且陣列中不包含任何重複項。

encoding

encoding

最小值,最大值

intset_ enc_ int16

-32768,32767 (-215~215-1)

intset_ enc_ int32

-2147483648,2147483647 (-231~231-1)

intset_ enc_ int64

(-263~263-1)

公升級(upgrade) (不支援降級)

每當我們要將乙個新元素新增到整數集合裡面,並且新元素的型別比整數集合現有所有元素的型別都要長時,整數集合需要先進行公升級( upgrade),然後才能將新元素新增到整數集合裡面。

三個步驟:

引發公升級的新元素擺放位置:當大於所有元素,放在最末尾(length-1); 小於所有元素,則放在最開頭(0)

好處:

總結壓縮列表

壓縮列表(ziplist)是列表鍵和雜湊鍵的底層實現之一。當乙個列表鍵只包含少量列表項,並且每個列表項要麼就是小整數值,要麼就是長度比較短的字串,那麼redis就會使用壓縮列表來做列表鍵的底層實現。

展示圖:

屬性型別

長度用途

zlbytes

uint32_ t

4位元組記錄整個壓縮列表占用的記憶體位元組數:在對壓縮列表進行記憶體重分配,或者計算zlend的位置時使用

zltail

uint32_ t

4位元組記錄壓縮列表表尾節點距離壓縮列表的起始位址有多少位元組:通過這個偏移量,程式無須遍歷整個壓縮列表就可以確定表尾節點的位址

zllen

uint16_ t

2位元組記錄了壓縮列表包含的節點數量:當這個屬性的值小於( 65535)時,這個屬性的值就是壓縮列表包含節點的數量;當這個值等於uint16_ max時,節點的真實數量需要遍歷整個壓縮列表才能計算得出

entryx

列表節點

不定壓縮列表包含的各個節點,節點的長度由節點儲存的內容決定

zlend

uint8_ t

1位元組特殊值0xff (十進位制255),用於標記壓縮列表的末端

總結

Redis 學習筆記 資料結構(1)

sds 簡單動態字串 sds的實現 struct sdshdr 問題 為什麼redis沒有直接使用c語言的字串而是使用了sds dynamic string 呢?鍊錶 鍊錶的實現 typedef struct list list typedef struct listnode listnode 特點...

學習筆記 資料結構

一 常用的資料結構 1 線性資料結構 元素之間一般存在元素之間存在一對一關係,是最常用的一類資料結構,典型的有 陣列 棧 佇列和線性表 2 樹形結構 結點間具有層次關係,每一層的乙個結點能且只能和上一層的乙個結點相關,但同時可以和下一層的多個結點相關,稱為 一對多 關係,常見型別有 樹 堆 3 圖形...

學習筆記 資料結構 堆結構

堆結構 實質是陣列 特點 以陣列的形式去儲存完全二叉樹 原理 以前序遍歷完全二叉樹,得出結點的前序序列,以陣列的形式儲存該序列。查詢父,子結點通過陣列下標id間的轉換關係實現。優點 節省儲存空間,查詢效率高 缺點 1 只能表示完全二叉樹 更廣泛的可以說是完全n叉樹 2 對樹的插入,刪除操作執行效率低...