跳跃表 -《Redis设计与实现》读书笔记
2021/8/2 19:07:02
本文主要是介绍跳跃表 -《Redis设计与实现》读书笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
使用场景
- 当有序集合包含的元素数量比较多 或者 有序集合中元素的成员是比较长的字符串时,使用跳跃表实现有序集合
- 集群节点中用作内部数据结构
定义
// 跳跃表节点 typedef struct zskiplistNode { // 成员对象:一个SDS值 // 在同一个跳跃表中,各个节点保存的成员对象必须是唯一的,但是多个节点保存的分值却可以是相同的 // 分值相同的节点将按照成员对象在字典序中的大小来进行排序,成员对象较小的节点会排在前面(靠近表头的方向),而成员对象较大的节点则会排在后面(靠近表尾的方向) sds ele; // 分值 // 跳跃表中的所有节点都按分值从小到大排序 double score; // 后退指针:用于从表尾向表头方向访问节点 // 每次只能后退至前一个节点 struct zskiplistNode *backward; // 层数组可以包含多个元素,每个元素都包含一个指向其他节点的指针 // 层可以加快访问其他节点的速度,一般来说,层的数量越多,访问其他节点的数据越快 // 每次创建一个新跳跃表节点的时候,根据幂次定律(越大的数出现的概率越小)随机生成一个介于1和32之间的值作为level数组的大小 struct zskiplistLevel { // 前进指针:用于从表头向表尾方向访问节点 struct zskiplistNode *forward; // 跨度:记录前进指针所指向节点和当前节点的距离 // 两个节点之间的跨度越大,相距得就越远 // 由于指向null的所有前进指针没有连向任何节点,所以跨度都为0 // 跨度用来计算排位(rank) unsigned long span; } level[]; } zskiplistNode; // 跳跃表 typedef struct zskiplist { // 指向跳跃表的表头节点:表头节点的后退指针、分值和成员对象属性都不会被用到,仅用到层属性 // 指向跳跃表的表尾节点 struct zskiplistNode *header, *tail; // 跳跃表内节点的数量 unsigned long length; // 跳跃表内层数最大的那个节点的层数(表头节点的层数不算) int level; } zskiplist;
源码阅读
- 文件:src/server.h、src/t_zset.c、src/sort.c
这篇关于跳跃表 -《Redis设计与实现》读书笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24Redis资料:新手入门快速指南
- 2024-12-24Redis资料:新手入门教程与实践指南
- 2024-12-24Redis资料:新手入门教程与实践指南
- 2024-12-07Redis高并发入门详解
- 2024-12-07Redis缓存入门:新手必读指南
- 2024-12-07Redis缓存入门:新手必读教程
- 2024-12-07Redis入门:新手必备的简单教程
- 2024-12-07Redis入门:新手必读的简单教程
- 2024-12-06Redis入门教程:从安装到基本操作
- 2024-12-06Redis缓存入门教程:轻松掌握缓存技巧