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 字节;
相关推荐
程序员老赵25 分钟前
Docker 部署 Dolibarr:轻松搭建开源 ERP/CRM 平台
运维·前端·后端
量化分析码农1 小时前
【Python量化系统工程实战 #06】从本地脚本到云端部署:量化系统的最小可运行架构
后端
136096757231 小时前
页面打不开不是 Nginx 的错
前端·后端
ALONE阿龙太原微码1 小时前
RBAC 以及主流权限模型
后端
斑鸠喳喳1 小时前
线程本地存储 ThreadLocal
java·后端
你顶住我先撤1 小时前
RocketMQ 消息类型
后端
ShineWinsu2 小时前
对于Redis:AOF持久化的解析
linux·数据库·redis·缓存·面试·持久化·aof
仍然.2 小时前
Redis---集群
数据库·redis·缓存
高频因子挖掘机3 小时前
批量行情返回后,怎样把请求失败的股票单独挑出来?
后端·github·api
小蒜学长3 小时前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险