Redis資料結構之跳躍表

2021-10-23 04:37:07 字數 1231 閱讀 5263

跳躍表在每個節點中維持多個指向其他節點的指標,可快速訪問節點且有序

跳躍表查詢複雜度為平均o(logn),最壞o(n)

跳躍表使用於有序集合元素數量比較多或者元素是比較長的字串的場景。

跳躍表節點

typedef

struct zskiplistnode level;

//後退指標

struct zskiplistnode *backward

//分值

double score;

//成員物件

robj *obj;

} zskiplistnode;

header: 指向跳躍表頭節點

tail: 指向跳躍表尾節點

level : 記錄跳躍表內層數最大的節點的層數

length : 跳躍表節點數量

層:每個層都包含前進指標和跨度,前進指標指向表尾方向的其他節點,跨度是記錄前進指標指向的節點和當前節點的距離。

後退指標:用bw標記,指向當前節點的前一節點

分值:節點中儲存的分值,節點按各自儲存的分值由小到大排列

在跳躍表中,各節點儲存的成員物件必須唯一,但多個節點儲存的分值卻可以相同,分值相同的節點將按照成員物件在字典序中的大小排列,從小到大排序。

跳躍表實現

type def struct zskiplist zskiplist;
跳躍表常用api

函式作用

時間複雜度

zslcreate

新建跳躍表

o(1)

zslfree

新增新節點

平均o(logn),最壞o(n)

zsldellte

刪除節點

平均o(logn),最壞o(n)

zslgetrank

返回節點在跳躍表中排位

平均o(logn),最壞o(n)

zslgetrank

返回節點在跳躍表中節點

平均o(logn),最壞o(n)

zslisinrange

給定分值範圍,返回在該範圍的所有節點

o(1)

zsldeleterangebyscore

給定分值範圍,刪除在該範圍的所有節點

o(n)

redis資料結構 跳躍表

跳躍表 skiplist 是一種有序資料鏈表結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。查詢平均效能為o logn 最壞的情況會出現o n 情況,而redis中的zset在資料較多的時候底層就是採用跳躍表去實現的,元素較少的時候會進行小物件壓縮採用壓縮列表實現。小...

Redis資料結構 跳躍表

跳躍表是一種有序資料結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。redis使用跳躍表作為有序集合鍵的底層實現之一,如果乙個有序集合包含的元素數量比較多,又或者有序集合中的元素的成員是比較長的字串時,redis就會使用跳躍表作為有序集合鍵的底層實現。redis的跳躍...

詳解Redis資料結構之跳躍表

我們先不談redis,來看一下跳表。場景來自小灰的演算法之旅,我們需要做乙個拍賣行系統,用來查閱和 遊戲中的道具,類似於魔獸世界中的拍賣行那樣,還有以下需求 拍賣行拍賣的商品需要支援四種排序方式,分別是 按 按等級 按剩餘時間 按 者id排序,排序查詢要盡可能地快。還要支援輸入道具名稱的精確查詢和不...