Redis ZSet(有序集合)底层数据结构

目录

一、核心两种底层结构

[1. 压缩列表(ziplist)](#1. 压缩列表(ziplist))

[2. 跳表(skiplist)+ 哈希表(dict)](#2. 跳表(skiplist)+ 哈希表(dict))

[(1)跳表 skiplist](#(1)跳表 skiplist)

[(2)字典 dict(哈希表)](#(2)字典 dict(哈希表))

二、总结一句话

补充


Redis ZSet 同时使用两种结构配合实现,根据元素数量和元素大小自动切换:

一、核心两种底层结构

1. 压缩列表(ziplist)

触发条件(同时满足):

  1. 集合元素数量 ≤ 128 (默认阈值 zset-max-ziplist-entries
  2. 每个元素的 member + score 总字节 ≤ 64 字节 (默认阈值 zset-max-ziplist-value

特点

  • 连续内存存储,内存占用小、读写快
  • 每个节点同时保存 scoremember,按 score 有序排列

2. 跳表(skiplist)+ 哈希表(dict)

触发条件:元素数量 / 元素大小 超出上面两个阈值,自动转为该组合结构。

(1)跳表 skiplist
  • 作用保证有序、支持范围查询ZRANGE/ZREVRANGE/ 区间遍历)
  • score 升序排序,多层索引结构,平衡树的简易替代,增删改查时间复杂度 O (log n)
  • Redis 跳表最大层数固定为 32 层
(2)字典 dict(哈希表)
  • 作用O (1) 快速查 score
  • Key = member,Value = score
  • 用来实现 ZSCOREZREM 等单成员快速操作

二、总结一句话

  • 小数据量 / 小元素 :只用 压缩列表 ziplist
  • 大数据量 / 大元素跳表 (skiplist) + 哈希表 (dict) 双结构协作

补充

Redis 跳表不使用红黑树:跳表实现更简单、无锁并发友好、区间遍历性能更强,完全适配 ZSet 场景。

相关推荐
Doraemomo5 小时前
数据结构-环形链表
java·数据结构·链表
IvorySQL7 小时前
PostgreSQL 日报 | JOIN 与外键优化(8 月 9 日)
数据库·postgresql
ltl7 小时前
自治数据库十年回顾:Peloton、NoisePage、OtterTune 到云原生 auto-tuning
数据库
灯澜忆梦9 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
爱跳舞的烤冷面9 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
C++ 老炮儿的技术栈11 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
MC皮蛋侠客11 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
疯狂打码的少年11 小时前
【数据结构】队列:定义、顺序队列与链式队列
数据结构·笔记
蔬菜_12 小时前
前端转全栈-day5(数组、list、set)
java·前端·数据结构·list
zt1985q12 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源