Redis的对象(5):有序集合对象

有序集合

有序集合的编码可以是 ziplist 或者 skiplist 。

ziplist编码

ziplist 编码的有序集合对象使用压缩列表作为底层实现, 每个集合元素使用两个紧挨在一起的压缩列表节点来保存, 第一个节点保存元素的成员(member), 而第二个元素则保存元素的分值(score)。

压缩列表内的集合元素按分值从小到大进行排序, 分值较小的元素被放置在靠近表头的方向, 而分值较大的元素则被放置在靠近表尾的方向。

skiplist编码

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

c 复制代码
typedef struct zset {

    zskiplist *zsl;

    dict *dict;

} zset;

zsl 跳跃表按分值从小到大保存了所有集合元素, 每个跳跃表节点都保存了一个集合元素: 跳跃表节点的 object 属性保存了元素的成员,score 属性则保存了元素的分值。

通过这个跳表,可以保证对象有序,而且可以使用范围型的操作。

dict 字典为有序集合创建了一个从成员到分值的映射, 字典中的每个键值对都保存了一个集合元素: 字典的键保存了元素的成员 , 而字典的值则保存了元素的分值。

通过这个字典,就可以以O(1)的时间复杂度查询到元素。

这种底层哈希表加链表的结构十分像java中的LinkedHashMap。

编码的转换

当有序集合对象可以同时满足以下两个条件时, 对象使用 ziplist 编码:

  1. 有序集合保存的元素数量小于 128 个;
  2. 有序集合保存的所有元素成员的长度都小于 64 字节;
相关推荐
喵了几个咪8 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
Flynt8 小时前
我把微信运动的排行榜和定点推送复刻了一遍:100万次步数更新只要4秒,坑在别处
redis·后端·性能优化
_孤傲_10 小时前
快速掌握 MySQL 语法
数据库·后端·mysql
IT_陈寒12 小时前
Java静态变量初始化坑得我头皮发麻
前端·人工智能·后端
步行cgn12 小时前
Thymeleaf 编辑表单详解:从字段回填到模拟 PUT 请求
后端
Song_RsHt13 小时前
Redis 与微服务,什么场景下无可替代
java·redis·后端·学习·微服务
学长毕设13 小时前
基于SpringBoot的建筑材料管理系统-附源码
java·spring boot·后端
程序员cxuan13 小时前
掀桌子了!Kimi K3.1 Pro 这效果也太离谱了。
人工智能·后端·程序员
摸爬滚打的小李14 小时前
关于 Arthas
java·后端
武子康14 小时前
黑图、彩色噪声、NaN、偏色怎么排查
人工智能·后端·agent