Redis Zset 的实现原理是什么?

Redis Zset 的实现原理是什么? Redis ZSet 有序集合实现原理ZSet 跳表(skiplist) 哈希表(dict)两套结构同时保存一份数据。数据特点成员member唯一不重复每个member绑定一个分数score按照score排序。1. 两个底层结构各自职责skiplist 跳表按照score做排序负责范围查询、排行榜、倒序、区间分页zrange、zrevrange、zrangebyscoreRedis的跳表是双向跳表节点带有back指针可以高效反向遍历。平均增删改查 O(log n)最大层数固定32层节点层数随机生成。dict 哈希表keymember成员value对应的score分数作用O(1)时间快速获取某个member的score判断成员是否存在保证member唯一性。插入的时候dict先判断member是否已经存在实现去重。⚠️两份结构存的是同一份数据内存会有少量额外开销换取查询性能。2. ziplist 压缩列表小zset当满足两个条件zset不使用跳表改用ziplist压缩列表存储元素数量 zset‑max‑ziplist‑entries默认128每个元素大小 zset‑max‑ziplist‑value默认64字节ziplist是连续内存节约内存内部按score有序排列。一旦超过阈值自动转换为 skiplist dict。3. 核心命令底层怎么走zadd key score memberdict判断member是否存在存在则更新score不存在新增将数据插入跳表按score维护有序zscore key member直接查dict哈希表O(1)返回分数不走跳表zrange key start end直接在skiplist做范围遍历 O(log n k)k是返回元素数量4. 业务场景排行榜、热搜、延时队列、带权重的有序列表面试常见坑score可以相同多个member允许分数一样score相同会按member字典序排序。zset没有给member单独过期的能力只能对整个zset key设置expire。不要存超大zsetzrange返回大量数据会阻塞Redis。总结ZSet底层分两种情况少量短元素用ziplist压缩列表数据量大则采用跳表哈希表组合。跳表负责排序和范围查询哈希表实现快速取score和去重。口述简短版Redis的zset数据少的时候用压缩列表。数据量大是跳表加上哈希表一起实现。跳表负责按照score排序用来做排行榜、范围查询哈希表用来快速拿到成员的分数保证成员不重复。注意成员唯一分数可以重复。