Redis设计与实现-跳跃表、压缩列表.docx

Redis设计与实现-跳跃表、压缩列表.docx

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

科技之佳文库 + 关注
官方认证
内容提供者

科技赋能未来,创新改变生活!

版权声明书
用户编号:8131073104000017
认证主体重庆有云时代科技有限公司
IP属地重庆
统一社会信用代码/组织机构代码
9150010832176858X3

1亿VIP精品文档

相关文档