Redis数据结构 之 SortedSet的底层原理解析
存储的时候我们可以发现,是有一个score(分数)的,这个就是用来排序的字段。
先说结论,SortedSet底层,根据配置会在不同的时候选用两种不同的数据结构zset,或ziplist进行存储:
首先,我们来看几个参数:
zset-max-ziplist-entries 128zset-max-ziplist-value 64 if (
field-value对的数量 ziplist.entries.size ||
任意一个filed或value长度 zset-max-ziplist-value
) {
// 使用 zset 进行存储
} else {
// 使用 ziplist 进行存储
zset的结构如下:
typedef struct zset {dict *dict;
zskiplist *zsl;
} zset
可以发现,是由字典+跳跃表实现的。
zset 结构体里有两个元素,一个是 dict,用来维护 数据 到 分数 的关系,一个是 zskiplist,用来维护 分数所在链表 的关系 dict 里通过维护 哈希表 存储了 张三= 100,李四= 90 的分数关系。而跳表则是排序的关键
先上图:
我们知道,链表的检索效率是非常低的,如果要拿到100条数据中间的数据,则需要遍历50个数据才行,为了解决这个问题,跳表应运而生
如上图,就是常规的跳表,会在原有的数据上加上若干层,指向当前层的下一个节点。
跳表的插入如上图所示:其实每个节点的层数是随机的,而且新插入一个节点不会影响其它节点的层数。因此,插入操作只需要修改插入节点前后的指针,而不需要对很多节点都进行调整。这就降低了插入操作的复杂度。实际上,这是skiplist跳表的一个很重要的特性,这让它在插入性能上明显优于平衡树的方案。
如下图,假如我们需要查询23,查询的路径如下。
事实上,在插入之前也要先经历一个类似的查找过程,在确定插入位置后,再完成插入操作。
这也是SortedSet实现排序的原理。
压缩列表 ziplist 是为 Redis 节约内存而开发的。
压缩列表是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点 (entry),每个节点可以保存 一个字节数组 或者 一个整数值 。
1、zl bytes:用于记录整个压缩列表占用的内存字节数
2、zl tail:记录要列表尾节点距离压缩列表的起始地址有多少字节
3、zl len:记录了压缩列表包含的节点数量。
4、entryX:要说列表包含的各个节点
5、zl end:用于标记压缩列表的末端
压缩列表是一种为了节约内存而开发的顺序型数据结构
压缩列表被用作列表键和哈希键的底层实现之一
压缩列表可以包含多个节点,每个节点可以保存一个字节数组或者整数值
添加新节点到压缩列表,可能会引发连锁更新操作。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 Redis数据结构 之 SortedSet的底层原理解析
相关文章
- 探究Redis应用原理:极致速度体验之旅(redis应用原理)
- 快速开发实用Redis封装类(redis封装类)
- 通过虚拟机实现本地Redis访问(虚拟机访问本地redis)
- 多种数据类型操作自定义注解助力Redis灵活多样数据处理(自定义注解实现redis)
- 秒杀火力全开Redis锁保护你的数据(秒杀 redis 锁)
- 深入了解Redis查看链接数及其影响原理(查看 redis 链接数)
- 权力存在的缓存Redis(权限存在redis)
- 实现快速访问数据库加载Redis(数据库加载redis)
- 支付行业突破性技术Redis的应用(支付行业redis)
- 极其方便Redis让登录变得更加简单(为什么redis用于登录)
- Vue技术实现访问远程Redis的精彩之旅(vue访问远端redis)
- 服务卸载Redis关闭服务优雅安全(卸载redis关闭)
- 构建可靠的基于 Redis 的缓存策略(基于redis的缓存策略)
- Redis存储过程图解让我们更好地理解它(图解redis存储原理)
- 深入浅出Redis高级原理(redis高级原理)
- 利用Redis获取极致性能的数据结构(redis高性能数据结构)
- Redis集群采用哨兵服务器保障高可用性(redis集群有哨兵吗)
- Redis阻塞工作机制剖析(redis阻塞工作原理)
- Redis队列清空任务的简易方法(redis队列清空)
- Redis中高效的键值对存储实现(redis键值对存储)
- Redis链表深入理解实现原理(redis链表实现原理)
- 利用Redis实现的多种数据结构特性(redis里面的数据结构)
- Redis配置放行让你自由访问(redis配置允许访问)
- 解析Redis部署的基本原理(redis部署原理)
- 使用Redis简单实现数据自动过期(redis设置过期命令)
- 深入浅出Redis 中 Hash 数据结构的设置使用(redis设置hash值)
- Redis计数器原理最简单最智能的计数方式(redis 计数器原理)
- Redis自增实现机制解析(redis 自增实现原理)
- 面试中的Redis缓存原理深度探究(redis缓存原理面试题)
- 展开Redis查询Key的运行原理(redis查询key原理)