当前位置:网站首页>Redis 入门-第四篇-数据结构与对象-跳跃表
Redis 入门-第四篇-数据结构与对象-跳跃表
2022-06-23 11:34:00 【tiger’s bytes】
跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问节点的目的。Redis 使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,或者有序集合中的元素的成员(member)是比较长的字符串时,Reids 就会使用跳跃表来作为有序集合键的底层实现。
和链表、字典等数据结构被广泛的应用在 Redis 内部不同,Redis 只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构。
跳跃表的实现:
Redis 的跳跃表由 redis.h/zskiplistNode 和 redis.h/zskiplist 两个结构定义:
typedef struct zskiplistNode {
struct zskiplistLevel {
struct zskiplistNode *forward; // 前进指针
unsigned int span; // 跨度
}level[];
struct zskiplistNode *backward; // 后退指针
double score; // 分值
robj *obj; // 成员对象
}zskiplistNode;typedef struct zskiplist {
struct zskiplistNode *header, *tail; // 表头结点和表尾节点的指针
unsigned long length; // 表中节点的数量(表头节点不计算在内)
int level; // 表中最大层数(表头节点不计算在内)
}- 层:跳跃表节点的 level 数组可以包含多个元素,每个元素都包含一个指向其它节点的指针,程序可以通过这些层来加快访问其他节点的速度,一般来说,层的数量越多,访问其它节点的速度就越快。每次创建一个新跳跃表节点的时候,程序都根据幂次定律(越大的数出现的概率越小)随机生成一个介于 1 ~ 32 之间的值作为 level 数组的大小,这就是层的高。
- 前进指针:每个层都有一个指向表尾方向的前进指针 (level[i].forward 属性),用于从表头向表尾方向访问节点。
- 跨度:(level[i].span) 用于记录两个节点之间的距离,跨度是用来计算节点的排位的,在查找某个节点的过程中,将沿途访问过的所有层的跨度加起来,得到的结果就是目标节点在跳跃表中的位置。
- 后退指针:用于从表尾向表头方向访问节点。
- 分值和成员:跳跃表中的节点都是按分值从小到大排列的,成员对象是一个指针,指向一个字符串对象,而字符串对象则保存着一个 SDS 值。
在同一个跳跃表中,各个节点保存的成员对象必须唯一,但是节点保存的分值可以相同,分值相同的节点将按成员对象在字典序中的大小来排序。

边栏推荐
- Vone news | wanglian technology empowers the public to enjoy the self-organization management of the chain network, creating an enterprise level alliance Dao
- Win10 wireless network. If the system cannot search WLAN, the solution (and VMnet1, 8)
- 每日一题day7-1652. 拆炸弹
- Win10 Microsoft input method (Microsoft Pinyin) does not display the word selection column (unable to select words) solution
- 全国进入主汛期,交通运输部:不具备安全运行条件的线路坚决停运!
- Introduction and use of vector
- "Core" has spirit "lizard", ten thousand people are online! Dragon Dragon community walks into Intel meetup wonderful review
- 汉源高科USB3.0光端机USB工业触摸屏光端机USB3.0光纤延长器USB3.0光纤传输器
- 1154. 一年中的第几天
- 手机证券开户交易?现在网上开户安全么?
猜你喜欢

【云舟说直播间】-数字安全专场明天下午正式上线

Rancher 2.6 全新 Monitoring 快速入门

全国进入主汛期,交通运输部:不具备安全运行条件的线路坚决停运!

tensorflow2的GradientTape求梯度

OpenHarmony应用开发【01】

64路PCM电话光端机64路电话+2路百兆以太网电话光端机64路电话PCM语音光端机

今天14:00 | 12位一作华人学者开启 ICLR 2022

After repeated pressure, Apple may significantly increase the price of iphone14

Android security / reverse interview questions

"Core" has spirit "lizard", ten thousand people are online! Dragon Dragon community walks into Intel meetup wonderful review
随机推荐
一般的理财产品期限是几天啊?
攻防演练合集 | 3个阶段,4大要点,蓝队防守全流程纲要解读
Design and implementation of esp32-cam wireless monitoring intelligent gateway
基本数据类型和对应的包装类
Gary Marcus发文:AI研究者需要知道的三个来自语言学家的观点
4K-HDMI光端机1路[email protected] HDMI2.0光端机 HDMI高清视频光端机
一张图解码 OpenCloudOS 社区开放日
Internet miracle - how does Xiaomi make profits
Surprise! Amd acquires Xilinx with USD 35billion!
2光2电级联型光纤收发器千兆2光2电光纤收发器迷你嵌入式工业矿用本安型光纤收发器
Whether Changan Lumin has the ability to become a broken product in the micro electricity market
Which securities company is the most reliable and safe to open an account
在工作中学习的三个方法
Esp32-cam high cost performance temperature and humidity monitoring system
ESP32-C3入门教程 问题篇⑦—— fatal error: esp_bt.h: No such file or directory 找不到esp_bt.h
[cloud based co creation] overview of the IOT of Huawei cloud HCIA IOT v2.5 training series
Win10 Microsoft input method (Microsoft Pinyin) does not display the word selection column (unable to select words) solution
64路PCM电话光端机64路电话+2路百兆以太网电话光端机64路电话PCM语音光端机
Creating neural networks using tensorflow2
Gradienttape of tensorflow2