底层实现_Redis有序集合zset的底层实现
1. 编码
zset的编码有ziplist和skiplist两种。
底层分别使用ziplist(压缩链表)和skiplist(跳表)实现。
- 什么时候使用ziplist什么时候使用skiplist?
当zset满足以下两个条件的时候,使用ziplist:
保存的元素少于128个 保存的所有元素大小都小于64字节
不满足这两个条件则使用skiplist。
(注意:这两个数值是可以通过redis.conf的zset-max-ziplist-entries 和 zset-max-ziplist-value选项 进行修改。)
2. 实现
- ziplist编码
关于什么是ziplist(压缩链表),可以参见这篇文章:Redis源码分析-压缩列表ziplist
ziplist 编码的有序集合对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个节点保存元素的分值。并且压缩列表内的集合元素按分值从小到大的顺序进行排列,小的放置在靠近表头的位置,大的放置在靠近表尾的位置。
![](/assets/blank.gif)
从小到大排列
![](/assets/blank.gif)
ziplist结构
- skiplist编码
skiplist 编码的有序集合对象使用 zet 结构作为底层实现,一个 zset 结构同时包含一个字典和一个跳表:
typedef struct zset{ //跳跃表 zskiplist *zsl; //字典 dict *dice;} zset;
字典的键保存元素的值,字典的值则保存元素的分值;跳跃表节点的 object 属性保存元素的成员,跳跃表节点的 score 属性保存元素的分值。
这两种数据结构会通过指针来共享相同元素的成员和分值,所以不会产生重复成员和分值,造成内存的浪费。
说明:其实有序集合单独使用字典或跳跃表其中一种数据结构都可以实现,但是这里使用两种数据结构组合起来,原因是假如我们单独使用 字典,虽然能以 O(1) 的时间复杂度查找成员的分值,但是因为字典是以无序的方式来保存集合元素,所以每次进行范围操作的时候都要进行排序;假如我们单独使用跳跃表来实现,虽然能执行范围操作,但是查找操作有 O(1)的复杂度变为了O(logN)。因此Redis使用了两种数据结构来共同实现有序集合。
参考资料:
- Redis详解(五)------ redis的五大数据类型实现原理
- Redis源码分析-压缩列表ziplist
作者:Katou_Megumi
链接:https://www.jianshu.com/p/e5a516831ac2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
底层实现_Redis有序集合zset的底层实现相关推荐
- Redis 为什么这么快? Redis 的有序集合 zset 的底层实现原理是什么? —— 跳跃表 skiplist
Redis有序集合 zset 的底层实现--跳跃表skiplist Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 ...
- Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset
Redis-列表List.集合Set.哈希Hash.有序集合 Zset 列表List 单键多值 常用命令 数据结构 Redis 集合(Set) 常用命令 数据结构 Redis 哈希(Hash) 常用命 ...
- redis有序集合zset详解
zset 概述 Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合. 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低 ...
- redis延迟队列 实现_php使用redis的有序集合zset实现延迟队列
延迟队列就是个带延迟功能的消息队列,相对于普通队列,它可以在指定时间消费掉消息. 延迟队列的应用场景: 1.新用户注册,10分钟后发送邮件或站内信. 2.用户下单后,30分钟未支付,订单自动作废. 我 ...
- php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能
许多网站都有排行榜的功能,比如球员人气榜单.阅读排行榜,对于一些小网站,通过查数据库就能实现排行榜的功能,但是对于稍微有点用户量而且还是实时排名的网站,使用一些关系型数据库如(MySQL.Oracle ...
- PythonRedis 无序集合set、有序集合zset操作
1.Redis控制台操作无序集合set 无序集合 元素为string类型 元素具有唯一性,不重复 redis操作: 设置 添加元素 SADD key member [member ...] 获取 返回 ...
- Redis-07Redis数据结构--有序集合ZSet
文章目录 概述 有序集合的数据结构 Redis 有序集合的部分命令 spring-data-redis 对有序集合的封装 使用 Spring 操作有序集合 注意 代码 概述 有序集合和集合类似,只是说 ...
- 使用Redis的有序集合Zset实现排行榜功能
游戏中存在各种各样的排行榜,比如玩家的等级排名.分数排名等.玩家在排行榜中的名次是其实力的象征,位于榜单前列的玩家在虚拟世界中拥有无尚荣耀,所以名次也就成了核心玩家的追求目标. 一个典型的游戏排行榜包 ...
- Redis中有序集合zset数据类型(增加(添加元素)、获取(获取指定范围元素、返回权值在min和max之间的成员、返回成员member的score值)、删除(删除指定元素和指定权值范围的元素))
sorted set,有序集合 元素为string类型 元素具有唯⼀性,不重复 [值不能重复] 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序 说明:没有修 ...
最新文章
- 独家 | 基于癌症生存数据建立神经网络(附链接)
- Spring mvc 注解@ResponseBody 返回内容编码问题
- linux安装toncat环境变量,linux下JDK,tomcat的安装与环境变量配置
- python与tensorflow知识点截图集锦(持续囤积)
- jqgrid实现客户端导出Excel、txt、word、json等数据格式的文件
- python点击网页按钮 没有id_button没有id,没有onclick事件。点击却有提交的功能,如何实现的?...
- java -jar debug_java – 如何在运行时调试jar?
- mknod 创建内核设备文件【原创】
- 昨天的性能优化与今天的网站故障
- Facebook正在追踪你,哪怕你不是用户丨扎克伯格国会听证第二日
- 蓝桥杯 ALGO-158 算法训练 sign函数
- POJ1182 食物链【并查集】
- 双系统win+ubuntu无法访问win的盘符
- Seasonal-ARIMA模型
- 关于操作系统设计的基本原理和设计原则
- apk一键脱壳工具_一键新机!强大的抹机王来了!
- Mask-rcnn算法流程图
- 写一个程序,将接收的华氏温度转换为对应的摄氏温度。
- Cutting (暴力 + 滚动哈希判字符串匹配)
- JFreeChart饼图, java程序中加载宋体字库