2024/8/13

8.13

1、redis数据结构

Redis 是怎样实现键值对(Key-Value)数据库的?

redis 中 key 是字符串对象,value 可以是字符串对象,也可以是集合数据类型对象。

redis 中是使用了一个【哈希表】保存所有键值对,哈希表中存放的是指向键值对数据的【指针】(dictEntry*)

C语言字符串结构的缺陷

  • O(N)时间复杂度获取字符串长度
  • 因为是以"\0"作为判断是否结束的依据,所以可能会提前误判结束,导致不能存储二进制数据,只能存文本数据。
  • C语言的字符串是不会记录自身的缓冲区大小的

sds的数据结构

  • 如果所需的 sds 长度小于 1 MB ,那么最后的扩容是按照翻倍扩容来执行的,即 2 倍的newlen
  • 如果所需的 sds 长度超过 1 MB ,那么最后的扩容长度应该是 newlen + 1MB

跳表

zset 结构体里有两个数据结构:一个是跳表,一个是哈希表。这样的好处是既能进行高效的范围查询,也能进行高效单点查询。

Zset 对象能支持范围查询(如 ZRANGEBYSCORE 操作),这是因为它的数据结构设计采用了跳表,而又能以常数复杂度获取元素权重(如 ZSCORE 操作),这是因为它同时采用了哈希表进行索引。

哈希表只是用于以常数复杂度获取元素的权重

跳表是在链表基础上改良过来的,实现了一种【多层】的有序链表

跳表的相邻两层的节点数量最理想的比例是2:1,查找复杂度可以降低到O(logN)

为什么Zset的实现用跳表而不用平衡树?

  • 从内存占用上来比较,跳表比平衡树更灵活一些。平衡树每个节点包含 2 个指针(分别指向左右子树),而跳表每个节点包含的指针数目平均为 1/(1-p),具体取决于参数 p 的大小。如果像 Redis里的实现一样,取 p=1/4,那么平均每个节点包含 1.33 个指针,比平衡树更有优势。
  • 在做范围查找的时候,跳表比平衡树操作要简单。在平衡树上,我们找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其它不超过大值的节点。如果不对平衡树进行一定的改造,这里的中序遍历并不容易实现。而在跳表上进行范围查找就非常简单,只需要在找到小值之后,对第 1 层链表进行若干步的遍历就可以实现。
  • 从算法实现难度上来比较,跳表比平衡树要简单得多。平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而跳表的插入和删除只需要修改相邻节点的指针,操作简单又快速。
相关推荐
D_FW几秒前
数据结构第四章:串
java·开发语言
Tao____几秒前
物联网平台二开
java·网络·物联网·mqtt·网络协议
Dylan的码园1 分钟前
JAVA中对象的几种比较
java·开发语言
emma_dd3 分钟前
final关键字
java
SimonKing5 分钟前
J人程序员的用屏技巧:软硬结合,让编码效率起飞
java·后端·程序员
小北方城市网7 分钟前
第 4 课:微服务 API 网关设计与接口全生命周期管理|统一入口与接口治理实战
java·大数据·运维·人工智能·python·深度学习·数据库架构
白典典8 分钟前
iTextPDF生成手册时目录页码与实际页码不匹配问题求助
java·spring·pdf·intellij-idea
进击的小菜鸡dd9 分钟前
Java求职面试:从Spring框架到微服务,谢飞机的奇妙面试之旅
java· 面试· 微服务· 数据库· 安全· spring· 缓存
计算机学姐16 分钟前
基于SpringBoot的高校体育场馆预约系统【个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·mysql·信息可视化·推荐算法
Coder_Boy_19 分钟前
基于SpringAI的在线考试系统设计-用户管理模块设计
java·大数据·人工智能·spring boot·spring cloud