redis zset源码

news/2025/1/21 0:02:13/文章来源:https://www.cnblogs.com/gdut17code/p/18238682

zset底层是由hash字典和跳表实现的,字典存储member->分数的映射关系,这样根据membe查询score的 时间复杂度O为1
跳表可以理解为多个层级的有序链表,每个节点可能在不同层级上,通过在不同层级的跳跃查找,把查询时间复杂度降低到 Olgn

1.随机层数,只有0.25的概率升级层数,最多64层
50%概率分配到第一层,25%概率分配到第二层。。
2.查找过程:
从最高层级开始查找,找到最后一个比查找元素小的节点,然后降一级,再次查找,直到找到改元素
例如,查找3
先从最高层开始找,发现4>3, 不满足,降低一层
从第二层开始找,发现2<3,满足,跨度=2,rank+=2;接着 2的下一个节点是4,4>3,不满足,降低一层,
从节点2的第一层开始找,3=3,满足,跨度=1,所以rank=3

  • 结构体定义
/* ZSETs use a specialized version of Skiplists */
typedef struct zskiplistNode {sds ele; // memberdouble score; struct zskiplistNode *backward; // 回溯指针,只有第一层才有值struct zskiplistLevel {struct zskiplistNode *forward;unsigned long span;} level[]; // 层级节点数组
} zskiplistNode;typedef struct zskiplist {struct zskiplistNode *header, *tail; // 头尾指针unsigned long length; int level; // 跳表层数
} zskiplist;typedef struct zset {dict *dict; // 字典,member->score 映射关系zskiplist *zsl; // 跳表结构
} zset;
  • 方法列表

zskiplist *zslCreate(void) {int j;zskiplist *zsl;zsl = zmalloc(sizeof(*zsl));zsl->level = 1;zsl->length = 0;zsl->header = zslCreateNode(ZSKIPLIST_MAXLEVEL,0,NULL);// 初始化每一层,最多64层for (j = 0; j < ZSKIPLIST_MAXLEVEL; j++) {zsl->header->level[j].forward = NULL;zsl->header->level[j].span = 0;}zsl->header->backward = NULL;zsl->tail = NULL;return zsl;
}#define ZSKIPLIST_MAXLEVEL 64 /* Should be enough for 2^64 elements */
#define ZSKIPLIST_P 0.25      /* Skiplist P = 1/4 */// 生成随机层数
int zslRandomLevel(void) {int level = 1;while ((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF))level += 1;return (level<ZSKIPLIST_MAXLEVEL) ? level : ZSKIPLIST_MAXLEVEL;
}// 跳表插入元素
zskiplistNode *zslInsert(zskiplist *zsl, double score, sds ele)// 查找某个元素的排名
unsigned long zslGetRank(zskiplist *zsl, double score, sds ele) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721847.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++U7-08-拓扑排序

拓扑:是指把实体抽象成与其大小形状无关的点,把连接实体的线路抽象成线,研究这些点线之间的相连关系。而表示点和线之间关系的图就被称为拓扑结构图。 拓扑学原本是一个数学概念,描述的是几何图形或空间在连续改变形状后还能保持不变的性质,它只考虑物体间的位置关系而不考…

管式土壤墒情监测仪:引领农业与环境研究的革命性工具

在农业科技日新月异的今天,管式土壤墒情监测仪凭借其独特的优势,已逐步成为农业和环境领域不可或缺的研究装备。这款监测仪,基于先进的介电常数原理,以其卓越的精确度和强大的功能,为研究人员提供了详尽而深入的土壤墒情数据,为探索土壤状况揭开了新篇章。管式土壤墒情监…

本地部署GLM-4-9B清华智谱开源大模型方法和对话效果体验

清华大学和智谱AI推出了全面升级的新一代基座大模型GLM-4,整体性能相比GLM3提升60%,支持128K上下文,可根据用户意图自主理解和规划复杂指令、完成复杂任务……GLM-4-9B是清华大学和智谱AI推出的最新一代预训练模型GLM-4系列中的开源版本。在语义、数学、推理、代码和知识等多…

minos 2.5 中断虚拟化——vGIC

首发公号:Rand_cs这一节开始讲述真正的中断虚拟化,首先来看硬件方面的虚拟化。前文 minos 2.3 中断虚拟化——GICv2 管理 主要讲述 GICv2 的 Distributor 和 CPU Interface,在 Hypervisor 存在的情况下,它们都是为 Hypervisor 服务的。现在有了 vm,vm 里面的内核也需要操作…

minos 2.6 中断虚拟化——虚拟中断子系统

首发公号:Rand_csHypervisor 需要对每个虚机的虚拟中断进行管理,这其中涉及的一系列数据结构和操作就是虚拟中断子系统 VIRQ 虚拟中断描述符 struct vcpu {uint32_t vcpu_id; .........../** member to record the irq list which the* vcpu is handling now*/struct virq_st…

minos 1.2 内存虚拟化——guest

首发公号:Rand_csminos 1.2 内存虚拟化——guest项目来自乐敏大佬:https://github.com/minosproject/minos本文继续讲述 minos 中的内存虚拟化中关于 guest 的部分,主要弄清楚一个问题,minos 如何管理 guest vm 的内存。 对于虚拟机的内存管理主要是 ipa 的管理,ipa 如何映…

minos 2.1 中断虚拟化——ARMv8 异常处理

首发公号:Rand_cs越往后,交叉的越多,大多都绕不开 ARMv8 的异常处理,所以必须得先了解了解 ARMv8 的异常处理流程 先说一下术语,从手册中的用词来看,在 x86 平台,一般将异常和中断统称为中断,在 ARM 平台,一般将中断和异常统称为异常 异常的流程,可以分为 3 个阶段,…

NSSCTF———MISC

[NISACTF 2022]huaji? [SWPU 2020]套娃 [LitCTF 2023]What_1s_BASE (初级) [SWPUCTF 2021 新生赛]gif好像有点大 [NISACTF 2022]为什么我什么都看不见 [LitCTF 2023]404notfound (初级) [LitCTF 2023]这羽毛球怎么只有一半啊(恼 (初级) [LitCTF 2023]喜欢我的压缩包么 (初级)…

BLP 模型

公号:Rand_csBLP 模型 本篇文章是调研了许多资料后对 BLP 模型的一个总结 MLS,Multi-level Security,主要关心的是数据机密性 D. Elliott Bell 和 Leonard J. LaPadula 在 1996 年提出了基本的 BLP 模型,主要有两个性质:The Simple Security Property states that a subje…

小端序题目——[LitCTF 2023]debase64

还挺有价值的,记录一下 题目DIEPE文件在Windows操作系统下默认使用小端序 IDA main函数绿框:输入长度要20 红框:base64加密 黄框:加密后的结果要与关键数据相等获取数据,我一般喜欢调试看栈,这样就少一次翻转了 取出15个数据:0x46, 0xED, 0x18, 0x96, 0x56, 0x9E, 0xD2,…

【闲话】高考集训之训什么

写的有些杂,凑活看吧好像高考语文作文被学校和《意林》押中题了,主题是“人工智能”,大势所趋。 贴一张奥奇海报(找不到具体来源了)来高考助力吧。本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18238551,未经允许严禁转载…

C++文件/流

C++文件读写(文本文件/二进制文件) 一、前言 常见的文件类型可分为两种:文本文件和二进制文件。 文本文件的阅读相对容易,可以使用记事本/Notepad++/VS Code等应用程序直接打开阅览;然而二进制文件由0/1序列组成,直接打卡二进制文件通常是乱码状态。如果需要读取二进制文…