跳躍表是一種以o(log n)期望時間支援查詢、插入、刪除操作的、有序的資料結構。
redis使用跳躍表作為有序集合鍵的底層實現之一。
跳表的基本實現原理參考:《skip lists: a probabilistic alternative to balanced trees》
redis的跳表由zskiplistnode, zskiplist兩個資料結構定義。
跳躍表節點的實現如下,由redis.h/zskiplistnode
定義:
/* zsets use a specialized version of skiplists */
typedef struct zskiplistnode level; // 層
} zskiplistnode;
redis中跳表和普通跳表區別如下:
redis通過zskiplist結構來持有跳表:
typedef struct zskiplist zskiplist;
api
功能複雜度
zskiplist *zslcreate(void);
建立跳表
o(1)
void zslfree(zskiplist *zsl);
釋放跳表
o(1)
zskiplistnode *zslinsert(zskiplist *zsl, double score, sds ele);
插入o(logn)
int zsldelete(zskiplist *zsl, double score, sds ele, zskiplistnode **node);
刪除跳表
o(logn)
unsigned long zslgetrank(zskiplist *zsl, double score, sds ele);
返回給定節點的排位
o(logn)
zskiplistnode* zslgetelementbyrank(zskiplist *zsl, unsigned long rank);
返回指定排位的節點
o(logn)
《redis設計與實現》第5章 跳躍表
四 跳躍表(Redis)
跳躍表 skiplist 是一種有序資料結構,它通過在每個節點中維持多個指向其他節點的 指標,從而達到快速訪問節點的目的。redis 的跳躍表由 redis.h zskiplistnode 和 redis.h zskiplist 兩個結構定 義,其中zskiplistnode結構用於表示跳躍表節點,...
Redis 閱讀筆記 跳躍表
跳躍表是一種有序資料結構,他通過每個節點維持多個指向其他節點的指標,從而達到快速訪問的目的。跳躍表平均支援o logn 最壞o n 複雜度的節點查詢,還可以通過順序性來批量處理節點。redis使用跳躍表作為有序集合鍵的底層實現之一,如果乙個有序集合包含的元素的數量比較多,或者有序集合中元素的成員是比...
Redis 學習 5 跳躍表
和鍊錶 字典等資料結構被廣泛地應用在redis內部不同,redis只在倆個地方用到了跳躍表,乙個是實現有序集合鍵,另乙個是在集群結點中用作內部資料結構,除此之外,跳躍表在redis裡面沒有其他用途。跳躍表 skiplist 是一種有序資料結構,他通過在每個結點中維持多個指向其他節點的指標,從而達到快...