首页 > 数据库 >redis跳跃表

redis跳跃表

时间:2023-03-19 21:12:09浏览次数:28  
标签:level redis zskiplistNode 表头 跳跃 节点 指针

Redis使用跳跃表作为有序集合键的底层实现之一,同时Redis是在集群节点内用作内部数据结构。

跳跃表的实现

Redis的跳跃表由redis.h/zskiplistNode和redis.h/zskiplist两个结构定义,其中zskiplistNode结构⽤于表⽰跳跃表节点,⽽zskiplist结构则⽤于保存跳跃表节点的相关信息,⽐如节点的数量,以及指向表头节点和表尾节点的指针等等。

skiplist

对于zskiplist结构:

  • header指向表头节点,tail指向表尾节点
  • level表示当前跳跃表中,层数最大
    的那个节点的层数。(表头节点不算,层数指图中L的个数)
  • length记录跳跃表长度,不计表头节点。
typedef struct zskiplist {
//表头节点和表尾节点
structz skiplistNode *header, *tail;
//表中节点的数量
unsigned long length;
//表中层数最⼤的节点的层数
int level;
} zskiplist;

zskiplistNode

对于zskiplistNode结构:

  • level []:构成节点的各个层,每个层定义有两个属性:forward和span,代表前进指针和跨度,上图中箭头上的数字就是跨度,代表从这个层到另一个节点的层跨过的节点数。当程序从表头节点向后遍历时,会通过该指针访问下一个节点。
    • 每次创建⼀个新跳跃表节点的时候,程序都根据幂次定律(powerlaw,越⼤的数出现的概率越⼩)随机⽣成⼀个介于1和32之间的值作为level数组的⼤⼩,这个⼤⼩就是层的“⾼度”。
    • 一般来说,层越多,访问其他节点的速度越快。
    • level[x].forward
    • level[x].span
      • 跨度,用于记录两节点之间的距离,跨度是⽤来计算排位(rank)的:在查找某个节点的过程中,将沿途访问过的所有层的跨度累计起来,得到的结果就是⽬标节点在跳跃表中的排位。
  • backward:后退指针。上图中BW即为后退指针,指向前一个节点。
    • 与前进指针一次性跳过多个节点不同,后退指针只能挨个后退,直到null结束。
  • score:分值。是一个double浮点数,上图中1.0、2.0、3.0是当前节点保存的分值,节点在跳跃表中以该分值按序排列。
  • obj:成员对象指针。各个节点保存的内容,上图中o1,o2,o3即为对象。
    • 指向字符串对象,字符串对象保存一个SDS值。
    • 在同一个跳跃表中,各节点保存的成员对象一定不相同,但分值可以相同,各节点按分值从小到大排列,分值相同的按成员对象在字典序中的大小排列。
typedef struct zskiplistNode {
	struct zskiplistNode *backward; // 后退指针
	double score; // 分度值
	robj *obj; // 成员对象
	struct zskiplistLevel {
		struct zskiplistNode *forward; // 前进指针
		unsigned int span; // 跨度
	} level []; // 层 
} zskiplist;

标签:level,redis,zskiplistNode,表头,跳跃,节点,指针
From: https://www.cnblogs.com/wz-NO1/p/17234301.html

相关文章

  • Redis持久化机制
    Redis持久化机制redis是用来做缓存。持久化:数据从内存->磁盘Redis官方提供了两种持久化机制。快照(SNAPSHOT)RDBAOF(AppendOnlyFile)只追加日志文件快照特点:这种方......
  • Redis的Linus下的安装
    RedisNoSQL:NotOnlySQL非关系型数据库。缓存流量比较大,不需要写sql语句。NoSQL的四大分类:1、键值(Key-Value)存储数据库。使用到一个哈希表,这个表中有一个指针指向特定的......
  • Redis的Linux下的安装
    Linus一,虚拟机下安装Linus选择虚拟机安装CentOS-7-x86_64-Minimal-1804的镜像,按顺序操作下一步创建root密码,如123456,点击完成,重启输入root和设定的密码123456进入系......
  • docker 安装redis
    dockersearchredis   或者去dockerHub上去找版本哪个版本用的人多就用哪个 2.dockerpulredis(dockerpull<镜像名称>:<版本号>默认是拉取latest)  ......
  • Redis-超卖问题
    悲观锁:简单粗暴,性能一般。认为线程安全一定会发生,在操作数据之前获取锁,确保线程串行执行。Synchronized。Lock都属于悲观锁 乐观锁,性能较好。认为线程安全问题不一定......
  • Redis实战—优惠卷
    全局ID生成器,满足以下特性: 1.唯一性,2.高可用,3.高性能,4.递增性,5.安全性。实现:拼接,ID会用数值:Long型直接插入数据库策略:UUID;Redis自增;雪花算法;数据库自增Redis自增:......
  • golang常用库包:缓存redis操作库go-redis使用(03)-高级数据结构和其它特性
    Redis高级数据结构操作和其它特性第一篇:go-redis使用,介绍Redis基本数据结构和其他特性,以及go-redis连接到Redishttps://www.cnblogs.com/jiujuan/p/17207166.html第......
  • [redis] 设置密码
    安装好redis之后默认没有密码。修改redis.conf配置设置密码参数requirepass配置redis访问密码重启服务生效在登录时输入密码:redis-cli-p6379-apwddocker......
  • redis字典
    一种保存键值对的抽象数据结构每个键都是独一无二的,换言之,自带去重。是redis数据库的底层实现。是Hash键的底层实现之一,当Hash键包含的键值对过多,或键值对中的元素都是......
  • redis常见问题总结
    redis主从是异步模式AOF和RDB复制都是才有子进程共享内存,写时复制实现的。Redis为了避免AOF文件越写越大,提供了AOF重写机制,当AOF文件的大小超过所设定的阈值后,Re......