ZSet 有序集合类型
掌握 ZSet 类型的特点与常用命令
理解排序与分数的机制
能实现排行榜、范围查询等场景
核心讲解
ZSet(Sorted Set)是有序集合,每个元素有一个分数(score),按分数排序,元素唯一,分数可以重复。
(1)核心特点
元素唯一,分数可以重复
按分数自动排序,从小到大
支持按分数、按排名范围查询
插入、删除、查找都很快
跳表实现
(2)常用命令
表格
命令 | 功能 |
|---|---|
| 添加元素,分数在前 |
| 获取元素的分数 |
| 按排名从小到大获取,0 开始 |
| 从大到小获取 |
| 按分数范围获取 |
| 获取元素的排名(从小到大,从 0 开始) |
| 倒序排名 |
| 元素分数增加 n |
| 元素数量 |
| 删除元素 |
| 分数范围内的元素数量 |
(3)适用场景
排行榜:游戏积分榜、销量榜、热度榜
排序数据:带权重的列表
范围查询:分数段筛选
延时队列:分数当时间戳
操作示例
# ===== 排行榜 =====
# 添加玩家分数
ZADD game_rank 1000 zhangsan 850 lisi 1200 wangwu 900 zhaoliu
# 从高到低排名(排行榜)
ZREVRANGE game_rank 0 -1 WITHSCORES
# 1. wangwu 1200
# 2. zhangsan 1000
# 3. zhaoliu 900
# 4. lisi 850
# 获取某人排名(从0开始,倒序)
ZREVRANK game_rank zhangsan
# 1,第二名
# 获取分数
ZSCORE game_rank lisi
# ===== 分数变化 =====
# 加分
ZINCRBY game_rank 50 lisi
# 减分
ZINCRBY game_rank -100 wangwu
# ===== 范围查询 =====
# 分数800~1000的玩家
ZRANGEBYSCORE game_rank 800 1000
# 分数小于900的数量
ZCOUNT game_rank -inf 900
# ===== 删除 =====
ZREM game_rank zhaoliu
# ===== 分页 =====
# 第一页,前3名,从高到低
ZREVRANGE game_rank 0 2 WITHSCORES
# 第二页
ZREVRANGE game_rank 3 5 WITHSCORES
常见误区
元素在前分数在后:ZADD 是分数在前,元素在后,很多人记反
排名从 1 开始:ZRANK/ZREVRANK 都是从 0 开始的,返回 0 是第一名
ZSet 只用来排序:分数可以是时间戳、权重、金额,很多场景都可以用
元素重复分数也重复:元素不能重复,分数可以重复,相同分数按字典序排
课后练习
用 ZSet 实现一个商品销量排行榜,5 个商品
查询销量前 3 名的商品和销量
查询销量在 100~500 之间的商品
思考:ZSet 和 Set 的核心区别是什么?
