SkipList
ZipList和QuickList的共同特點是節省內存。在遍歷元素時,只能從頭到尾或從尾到頭,所以在查找頭尾元素性能還是不錯的,但是中間元素查詢的性能就會差。
**SkipList(跳表)**首先是鏈表,但與傳統鏈表相比有幾點差異:
- 元素按照升序排列存儲
- 節點可能包含多個指針,指針跨度不同
// t_zset.c
typedef struct zskiplist {// 頭尾節點指針struct zskiplistNode *header, *tail;// 節點數量unsigned long length;// 最大的索引層級,默認是1int level;
} zskiplist;
// t_zset.c
typedef struct zskiplistNode {sds ele; // 節點存儲的值double score;// 節點分數,排序、查找用struct zskiplistNode *backward; // 前一個節點指針struct zskiplistLevel {struct zskiplistNode *forward; // 下一個節點指針unsigned long span; // 索引跨度} level[]; // 多級索引數組
} zskiplistNode;
一級指針:
二級指針:
三級指針:
SkipList的特點:
- 跳躍表是一個雙向鏈表,每個節點都包含score和ele值
- 節點按照score值排序升序,score值一樣則按照ele字典排序
- 每個節點都可以包含多層指針,層數是1到32之間的隨機數
- 不同層指針到下一個節點的跨度不同,層級越高,跨度越大
- 增刪改查效率與紅黑樹基本一致,實現卻更簡單