1. 编码

zset的编码有ziplistskiplist两种。
底层分别使用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 编码的有序集合对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个节点保存元素的分值。并且压缩列表内的集合元素按分值从小到大的顺序进行排列,小的放置在靠近表头的位置,大的放置在靠近表尾的位置。

从小到大排列

ziplist结构

  • skiplist编码

skiplist 编码的有序集合对象使用 zet 结构作为底层实现,一个 zset 结构同时包含一个字典和一个跳表:

typedef struct zset{     //跳跃表     zskiplist *zsl;     //字典     dict *dice;} zset;

字典的键保存元素的值,字典的值则保存元素的分值;跳跃表节点的 object 属性保存元素的成员,跳跃表节点的 score 属性保存元素的分值。

这两种数据结构会通过指针来共享相同元素的成员和分值,所以不会产生重复成员和分值,造成内存的浪费。

说明:其实有序集合单独使用字典或跳跃表其中一种数据结构都可以实现,但是这里使用两种数据结构组合起来,原因是假如我们单独使用 字典,虽然能以 O(1) 的时间复杂度查找成员的分值,但是因为字典是以无序的方式来保存集合元素,所以每次进行范围操作的时候都要进行排序;假如我们单独使用跳跃表来实现,虽然能执行范围操作,但是查找操作有 O(1)的复杂度变为了O(logN)。因此Redis使用了两种数据结构来共同实现有序集合。


参考资料:

  1. Redis详解(五)------ redis的五大数据类型实现原理
  2. Redis源码分析-压缩列表ziplist

作者:Katou_Megumi
链接:https://www.jianshu.com/p/e5a516831ac2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

底层实现_Redis有序集合zset的底层实现相关推荐

  1. Redis 为什么这么快? Redis 的有序集合 zset 的底层实现原理是什么? —— 跳跃表 skiplist

    Redis有序集合 zset 的底层实现--跳跃表skiplist Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 ...

  2. Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset

    Redis-列表List.集合Set.哈希Hash.有序集合 Zset 列表List 单键多值 常用命令 数据结构 Redis 集合(Set) 常用命令 数据结构 Redis 哈希(Hash) 常用命 ...

  3. redis有序集合zset详解

    zset 概述 Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合. 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低 ...

  4. redis延迟队列 实现_php使用redis的有序集合zset实现延迟队列

    延迟队列就是个带延迟功能的消息队列,相对于普通队列,它可以在指定时间消费掉消息. 延迟队列的应用场景: 1.新用户注册,10分钟后发送邮件或站内信. 2.用户下单后,30分钟未支付,订单自动作废. 我 ...

  5. php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能

    许多网站都有排行榜的功能,比如球员人气榜单.阅读排行榜,对于一些小网站,通过查数据库就能实现排行榜的功能,但是对于稍微有点用户量而且还是实时排名的网站,使用一些关系型数据库如(MySQL.Oracle ...

  6. PythonRedis 无序集合set、有序集合zset操作

    1.Redis控制台操作无序集合set 无序集合 元素为string类型 元素具有唯一性,不重复 redis操作: 设置 添加元素 SADD key member [member ...] 获取 返回 ...

  7. Redis-07Redis数据结构--有序集合ZSet

    文章目录 概述 有序集合的数据结构 Redis 有序集合的部分命令 spring-data-redis 对有序集合的封装 使用 Spring 操作有序集合 注意 代码 概述 有序集合和集合类似,只是说 ...

  8. 使用Redis的有序集合Zset实现排行榜功能

    游戏中存在各种各样的排行榜,比如玩家的等级排名.分数排名等.玩家在排行榜中的名次是其实力的象征,位于榜单前列的玩家在虚拟世界中拥有无尚荣耀,所以名次也就成了核心玩家的追求目标. 一个典型的游戏排行榜包 ...

  9. Redis中有序集合zset数据类型(增加(添加元素)、获取(获取指定范围元素、返回权值在min和max之间的成员、返回成员member的score值)、删除(删除指定元素和指定权值范围的元素))

    sorted set,有序集合 元素为string类型 元素具有唯⼀性,不重复   [值不能重复] 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序 说明:没有修 ...

最新文章

  1. 独家 | 基于癌症生存数据建立神经网络(附链接)
  2. Spring mvc 注解@ResponseBody 返回内容编码问题
  3. linux安装toncat环境变量,linux下JDK,tomcat的安装与环境变量配置
  4. python与tensorflow知识点截图集锦(持续囤积)
  5. jqgrid实现客户端导出Excel、txt、word、json等数据格式的文件
  6. python点击网页按钮 没有id_button没有id,没有onclick事件。点击却有提交的功能,如何实现的?...
  7. java -jar debug_java – 如何在运行时调试jar?
  8. mknod 创建内核设备文件【原创】
  9. 昨天的性能优化与今天的网站故障
  10. Facebook正在追踪你,哪怕你不是用户丨扎克伯格国会听证第二日
  11. 蓝桥杯 ALGO-158 算法训练 sign函数
  12. POJ1182 食物链【并查集】
  13. 双系统win+ubuntu无法访问win的盘符
  14. Seasonal-ARIMA模型
  15. 关于操作系统设计的基本原理和设计原则
  16. apk一键脱壳工具_一键新机!强大的抹机王来了!
  17. Mask-rcnn算法流程图
  18. 写一个程序,将接收的华氏温度转换为对应的摄氏温度。
  19. Cutting (暴力 + 滚动哈希判字符串匹配)
  20. JFreeChart饼图, java程序中加载宋体字库

热门文章

  1. navicate连接Linux下mysql慢,卡,以及mysql相关查询,授权
  2. 所选驱动器不再有效,继续安装之前,请先检查安装路径的设置
  3. 多线程相互排斥--mutex(二)
  4. MYSQL 时间计算的 3 种函数
  5. ASP.NET MVC应用程序实现下载功能
  6. PowerShell自动删除过期数据
  7. Scrum失败/成功案例分析
  8. Winform 打包 混淆 自动更新
  9. C#进阶系列——WebApi 接口测试工具:WebApiTestClient
  10. django-2-目录结构