详解redis(10):数据结构Zset

Redis 中的 Zset(有序集合,Sorted Set)是五种基本数据类型之一,它在 Set(无序集合)的基础上增加了按 score(分值)进行排序的能力,同时保留了集合不允许元素重复的特性(member 唯一,但 score 可以重复)。

一、Zset 的核心特性

每个元素由两部分组成:

member:元素值(字符串类型),不允许重复。

score:排序依据(双精度浮点数),可以重复。

元素按照 score 从小到大自动有序排列(score 相同时按 member 的字典序排列)。

支持高效的范围查询(ZRANGE、ZREVRANGE)、按 rank 查找(ZRANK)、按 score 范围删除(ZREMRANGEBYSCORE)等操作。

时间复杂度:

添加/删除/查找单个元素:O(log N)

范围查询(返回 K 个元素):O(log N + K)

获取排名:O(log N)

二、底层数据结构的实现

Redis 对 Zset 采用 空间-时间权衡 的双编码策略,根据集合规模动态选择底层结构:

条件满足时使用 listpack(以前是 ziplist) 否则使用 skiplist + dict
元素个数 < 128(zset-max-listpack-entries) 跳表 + 哈希表
所有 member 的长度 < 64 字节(zset-max-listpack-value)

listpack(小集合优化编码,Redis 7.0 及以上取代 ziplist)

连续的内存块,类似于紧凑数组。

每个 entry 包含:前一个 entry 长度、当前 entry 长度、内容。

优点:极致节省内存(通常比 skiplist 节省 50%--80% 内存),缓存友好。

缺点:插入/删除操作最坏 O(N),因为可能引发连锁更新(cascading update)。

因此只适合 小规模 集合。

skiplist + dict(大规模集合默认实现)

跳表(zskiplist):负责按 score 有序排列,提供 O(log N) 的增删改查及范围遍历能力。

多层索引的有序链表,每层节点数量呈指数递减(概率 p=0.25)。

支持正向/反向遍历,天然适合 ZRANGE / ZREVRANGE / ZRANK 等操作。

每个节点额外存储 score 和指向 member 的指针。

哈希表(dict):负责 member → score 的快速查找(O(1)),以及保证 member 唯一性。

添加元素时,同时插入跳表和哈希表。

删除/查找时,先查哈希表得到 score,再去跳表删除/定位。

优点:综合性能优秀,范围操作高效。

缺点:内存开销较大(每个元素平均约 30--40 字节额外指针开销)。

三、应用场景

经典游戏积分/战力排行榜

这是 ZSet 最常见、最典型的使用场景。

核心需求

实时更新玩家分数

随时查询全球/区服前 N 名

查询某玩家的当前排名

支持分页展示排行榜

实现方式

Key:game:global:rank 或 game:server:1001:rank(支持多服隔离)

Member:玩家唯一标识(通常使用 user_id 或 player_id)

Score:积分、战力等数值(数值越大排名越靠前

相关推荐
蓝胖子酱5 小时前
在 Electron 中用 electron-store 实现加密存储与自定义格式文件
前端·javascript·数据库
snow@li5 小时前
Redis:数据库语法速查表 / 全景梳理
数据库·redis·缓存
Devlive 开源社区6 小时前
Nebula 1.6.0 发布:跨区域桶自动路由、秒传、文本/PDF 预览一次到位
数据库·sql
这个DBA有点耶6 小时前
导个数据中文全变问号?字符集这事儿真没那么简单
数据库·mysql·代码规范
兰令水6 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
wuqingshun3141596 小时前
MYSQL中如果发生死锁应该如何解决?
数据库·mysql
cpp_25017 小时前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
DO_Community7 小时前
Weaviate 托管数据库现已在 DigitalOcean 上开放公测
数据库·人工智能·开源·向量数据库·weaviate
报错小能手7 小时前
索引常见面试题
数据库
Database_Cool_7 小时前
时序数据库选型:阿里云 Lindorm 时序引擎 vs InfluxDB 全维度对比
数据库·阿里云·时序数据库