- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
?
?
Redis设计与实现
跳跃表、压缩列表
?
?
前言
Redis设计与实现读书笔记,基础数据结构部分——跳跃表与压缩列表
文章目录
前言
一、跳跃表
1.1 跳跃表概念
1.2 Redis中跳跃表的实现
1.3 跳跃表节点(zskipListNode)
1.4 手动模拟跳跃表
1.4.1 数据结构
1.4.2 查找
1.4.3 删除
1.4.4 插入
二、整数集合
2.1 介绍
2.2 整数集合的实现
2.3 整数集合升级
三、压缩列表
3.1 介绍
3.2 压缩列表的构成
3.3 压缩列表节点的组成
3.4 连锁更新的问题
一、跳跃表
1.1 跳跃表概念
跳表(SkipList) 是用于有序元素序列快速搜索查找的一个数据结构,跳表是一个随机化的数据结构,实质上是一种可进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。同时跳表不仅能够提高搜索性能,还能够提高插入删除操作的性能。总的来说性能和红黑树、AVL树不相上下,但是跳表原理更加简单,实现起来更加简单。
Redis 使用跳跃表作为有序集合(Zset)的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时,Redis 就会使用跳跃表来作为有序集合键的底层实现。
1.2 Redis中跳跃表的实现
Redis中的跳跃表由 zskiplistNode(表示跳跃表节点)、zskiplist(跳跃表,保存跳跃表节点的相关信息,比如节点数量、指向表头节点和表尾节点的指针)。
typedef struct zskiplist {
// 表头节点和表尾节点
struct zskiplistNode *header,*tail;
// 表中节点的数量
unsigned long length;
// 表中层数最大的节点的层数
int level;
} zskiplist;
1.3 跳跃表节点(zskipListNode)
typedef struct zskiplistNode {
// 层
struct zskiplistLevel {
// 前进指针
struct zskiplistNode *forward;
// 跨度
unsigned int span;
} level[];
// 后退指针
struct zskiplistNode *backward;
// 分值
double score;
// 成员对象
robj *obj;
} zskiplistNode;
层每次创建一个新跳跃节点时,程序都根据幂次定律生成一个介于1到32之间的值作为 level 数组的大小。跳跃节点中的level 数组包含多个元素,其中每个元素包含一个指向其他节点的指针,程序可以通过这些层来加快访问其他节点的速度,一般来说,层的数量越多,访问其他节点的速度就越快。
前进指针跳表节点中每层都有一个前进指针,通过前进指针访问到下一个节点;
跨度跨度用来计算排位(rank)的,在查找某个节点的过程中,将沿途访问过的所有层的跨度累计起来,得到的结果就是目标节点在跳跃表中的排位。跨度用于记录两个节点之间的距离,跨度越大相距的越远。
后退指针用于从表尾向表头访问,与可以一次跳过多个前进指针不同,因为每个节点只有一个后退指针,因此一次只能后退一步。
1.4 手动模拟跳跃表
1.4.1 数据结构
/**
* 跳跃节点
* @param T
*/
public class SkipNodeT {
public int key;
public T value;
public SkipNode right,down;
public SkipNode(int key, T value) {
this.key = key;
this.value = value;
}
public SkipNode(){
this.key = Integer.MIN_VALUE;
value = null;
}
}
/**
* 跳跃表
*/
public class SkipListT {
//头节点
public SkipNodeT headNode;
//当前跳表层数(最高)
public int highlevel;
//默认最大层数
public final int MAX_LEVEL
您可能关注的文档
- Python语言程序设计-文件和数据格式化.docx
- Python语言程序设计基础.docx
- Python课程设计爬虫篇.docx
- QT学习1:设计可视化窗口的框架-Ui-Class.docx
- RBAC权限系统分析、设计与实现.docx
- Redis+Nginx+JVM+设计模式+Spring全家桶+Dubbo.docx
- Redis+Nginx+设计模式+Spring全家桶+Dubbo精选.docx
- Redis+Nginx+设计模式+Spring全家桶+Dubbo精选概述.docx
- redis-list类型的设计与实现.docx
- redis-string类型的设计与实现.docx
- 重庆七中2025届高考仿真卷化学试卷含解析.doc
- 福建省福州市福建师大附中2025届高考全国统考预测密卷生物试卷含解析.doc
- 山东省聊城市高唐一中2025届高三下学期联考生物试题含解析.doc
- 2025届贵州省黔东南市重点中学高考历史一模试卷含解析.doc
- 2025届广东省五校高三下学期联合考试生物试题含解析.doc
- 河南省邓州市花洲实验高级中学2025届高考化学倒计时模拟卷含解析.doc
- 2025届忻州市第一中学高考压轴卷生物试卷含解析.doc
- 安徽师范大学附属中学2025届高考历史倒计时模拟卷含解析.doc
- 2025届山东省临淄中学高三最后一卷历史试卷含解析.doc
- 湖南省长沙市宁乡一中2025届高三压轴卷历史试卷含解析.doc
文档评论(0)