Redis中的跳跃表

Redis中的跳跃表

  • 跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的
  • 跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点
  • 跳跃表在Redis用于实现有序集合键和在集群节点中用作内部数据结构

跳跃表的实现

// 跳跃表节点
typedef struct zskiplistNode {
    // 层
    struct zskiplistLevel {
        // 前进指针
        struct zskiplistNode *forward;
        // 跨度
        unsigned int span;
    } level[];
    // 后退指针
    struct zskiplistNode *backward;
    // 分数
    double score;
    // 成员对象
    robj *obj;
} zskiplistNode;
// 跳跃表
typedef struct zskiplist {
    // 表头节点和表尾节点
    structz skiplistNode *header, *tail;
    // 表中节点的数量
    unsigned long length;
    // 表中层数最大的节点的层数
    int level;
} zskiplist;

  • 每次创建一个新跳跃表节点的时候,程序都根据幂次定律(越大的数出现的概率越小)随机生成一个介于1和32之间的值作为level数组的大小,这个大小就是层的“高度”

跳跃表API

函数 作用 时间复杂度
zslCreate 创建一个新的跳跃表 O(1)
zslFree 释放给定跳跃表,以及表中包含的所有节点 O(N),N为跳跃表的长度
zslInsert 将包含给定成员和分值的新节点添加到跳跃表中 平均O(logN),最坏O(N),N为跳跃表长度
zslDelete 删除跳跃表中包含给定成员和分值的节点 平均O(logN),最坏O(N),N为跳跃表长度
zslGetRank 返回包含给定成员和分支在跳跃表中的排位 平均O(logN),最坏O(N),N为跳跃表长度
zslGetElementByRank 返回跳跃表在给定排位上的节点 平均O(logN),最坏O(N),N为跳跃表长度
zslIsInRange 给定一个分值范围,如果跳跃表有至少一个节点的分值在这个范围之内,那么返回1,否则返回0 通过跳跃表的表头节点和表尾节点,这个检测可以用O(1)复杂度完成
zslFirstInRange 给定一个分值范围,返回跳跃表中第一个符合这个范围的节点 平均O(logN),最坏O(N),N为跳跃表长度
zslLastInRange 给定一个分值范围,返回跳跃表中最后一个符合这个范围的节点 平均O(logN),最坏O(N),N为跳跃表长度
zslDeleteRangeByScore 给定一个分值范围,删除跳跃表中所有在这个范围之内的节点 O(N),N为被删除节点数量
zslDeleteRangeByRank 给定一份排位范围,删除跳跃表中所有在这个范围之内的节点 O(N),N为被删除节点数量

原文地址:https://www.cnblogs.com/hhe0/p/9243919.html

时间: 2024-10-06 15:02:43

Redis中的跳跃表的相关文章

Redis中有序集合与列表占用内存分析

在说正题之前需要先了解几种定义:字典.压缩列表与跳跃表. 字典:非常常见的数据结构,key-value结构. 常见的实现有红黑树(stl中的map),哈希表(stl中的unordered_map).红黑树的查找操作具有O(logN)的时间复杂度.哈希表的查找操作具有O(1)的时间复杂度. redis中的字典使用哈希表作为底层实现. 压缩列表:由一些列特殊编码的连续内存块组成的顺序型数据结构. 压缩列表可以包含多种节点(只能保存一种的那叫数组). 压缩列表的优点是节省内存.顺序结构拥有的缺点压缩列

Redis中的数据结构

1. 底层数据结构, 与Redis Value Type之间的关系 对于Redis的使用者来说, Redis作为Key-Value型的内存数据库, 其Value有多种类型. String Hash List Set ZSet 这些Value的类型, 只是"Redis的用户认为的, Value存储数据的方式". 而在具体实现上, 各个Type的Value到底如何存储, 这对于Redis的使用者来说是不公开的. 举个粟子: 使用下面的命令创建一个Key-Value $ SET "

redis中key的归类

redis中可以使用前缀对key进行归类: 例如:key: ITEM_INFO:123456:BASE ITEM_INFO:123456:DESC 作用:方便进行管理 如果把二维表保存到redis中: 1.表名就是第一层 2.主键是第二层 3.字段名第三层 三层使用“:”分隔作为key,value就是字段中的内容. 原文地址:https://www.cnblogs.com/niuchuangfeng/p/10213448.html

redis源码分析4---结构体---跳跃表

redis源码分析4---结构体---跳跃表 跳跃表是一种有序的数据结构,他通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的: 跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点.性能上和平衡树媲美,因为事先简单,常用来代替平衡树. 在redis中,只在两个地方使用了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构. 1 跳跃表节点 1.1 层 层的数量越多,访问其他节点的速度越快: 1.2 前进指针 遍历举例

学习笔记-Redis设计与实现-跳跃表

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的. 跳跃表支持平均O(logN).最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点. Redis使用跳跃表作为有序结合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(member)是比较长的字符串时,Redis就会使用跳跃表来作为有序集合见的底层实现. 5.1 跳跃表的实现 zskiplist结构,包含以下属性: header:

redis - 跳跃表详细介绍

redis吸引很多人使用的一个重要的原因,就是它对众多数据类型的支持.包括string,hash,set,zset,list等五种数据对象. 其中zset用来保证数据的有序存储,实现中,redis使用跳跃表和压缩列表,作为zset的底层实现.当元素数量比较多,或者元素成员是比较长的字符串时,底层实现采用跳跃表. 跳跃表是什么? 一种有序的数据结构,通过在节点中维持多个指向其它节点的指针,达到快速访问的目的. 跳跃表的好处是什么? 1. 跟平衡树相比,实现简单: 2. 平均复杂度为O(logN),

redis的跳跃表

跳跃表是一种插入.查询.删除的平均时间复杂度为O(nlogn)的数据结构,在最差情况下是O(n),当然这几乎很难出现. 和红黑树相比较 最差时间复杂度要差很多,红黑树是O(nlogn),而跳跃表是O(n) 平均时间复杂度是一样的 实现要简单很多 https://en.wikipedia.org/wiki/Skip_list 维基的跳跃表例子 跳跃表的结构如上图 跳跃表的实现还是一个链表,是一个有序的链表,在遍历的时候基于比较,但普通链表只能遍历,跳跃表加入了一个层的概念,层数越高的元素越少,每次

redis 系列7 数据结构之跳跃表

一.概述 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的.在大部分情况下,跳跃表的效率可以和平衡树(关系型数据库的索引就是平衡树结构)相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序使用跳跃表来代替平衡树. Redis使用跳跃表作为"有序集合键"的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现.

redis跳跃表

最近在阅读redis设计与实现,关于redis数据结构zset的一种底层实现跳跃表一直没有太理解,所以在搜了一下资料,终于搞懂了它的设计思路,记录一下. 参考链接:https://mp.weixin.qq.com/s?src=11&timestamp=1553915878&ver=1515&signature=SuSdA-Ka7Bs7CzSnNHgHFR7DkFFibGdRUui-FkuSRn2OJOkn6uvGznFMheSfoxaSHYlcgfGnBQ9imQdTAg5hiaq