8.1.7 ZSet类型与常用命令
ZSet(有序集合)在Set基础上为每个成员关联一个 score(浮点数),成员唯一且按 score 排序,适用于排行榜、范围检索与延时队列。内部常见结构为跳表+字典(或压缩列表),支持按分值与字典序的高效查询。
安装与连接(示例)
# 安装 Redis(以 Debian/Ubuntu 为例)
sudo apt-get update
sudo apt-get install -y redis-server
# 启动并检查
sudo systemctl enable --now redis-server
redis-cli PING
# 预期输出:PONG
核心命令与解释
- ZADD key score member [score member ...]:添加/更新成员分值。NX仅新增,XX仅更新,CH返回变更数。
- ZREM key member [member ...]:移除成员。
- ZINCRBY key increment member:对成员分值做增量操作。
- ZSCORE key member:查询成员分值。
- ZCARD key:成员数量。
- ZRANK/ZREVRANK key member:获取升序/降序排名(从0开始)。
- ZRANGE/ZREVRANGE key start stop [WITHSCORES]:按排名区间返回。
- ZRANGEBYSCORE/ZREVRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]:按分值范围查询与分页。
- ZCOUNT key min max:统计分值区间数量。
- ZPOPMIN/ZPOPMAX key [count]:弹出最小/最大分值成员。
完整可执行示例:排行榜
# 初始化排行榜
redis-cli ZADD rank 120 user1 150 user2 90 user3
# user1 加 30 分
redis-cli ZINCRBY rank 30 user1
# 预期:返回 150(120+30)
# 查看前 2 名(分数高到低)
redis-cli ZREVRANGE rank 0 1 WITHSCORES
# 预期:
# 1) "user2"
# 2) "150"
# 3) "user1"
# 4) "150"
# 查询 user3 排名(高到低)
redis-cli ZREVRANK rank user3
# 预期:2
完整可执行示例:延时队列
# score=未来执行时间戳(秒)
now=$(date +%s)
redis-cli ZADD delayq $((now+5)) taskA $((now+10)) taskB
# 拉取到期任务(now 之前)
redis-cli ZRANGEBYSCORE delayq 0 $now WITHSCORES LIMIT 0 10
# 预期:到期的任务列表
# 取出并删除到期任务
redis-cli ZPOPMIN delayq 1
范围检索与分页
# 初始化商品热度
redis-cli ZADD hot 10 itemA 20 itemB 30 itemC 40 itemD 50 itemE
# 查询热度 20~50 的商品,分页(每页2条)
redis-cli ZRANGEBYSCORE hot 20 50 WITHSCORES LIMIT 0 2
redis-cli ZRANGEBYSCORE hot 20 50 WITHSCORES LIMIT 2 2
常见排错
1. ZADD 无法更新:检查是否误用了 NX/XX。
redis-cli ZADD rank NX 200 user1
# 若返回 0,表示 user1 已存在,NX 不更新
- 范围查询为空:确认 score 边界与开区间符号。
redis-cli ZRANGEBYSCORE hot (20 50 WITHSCORES
# (20 表示大于20,不含20
- 排序异常:score 为浮点数,避免用高精度比较;必要时统一放大为整数。
redis-cli ZADD rank 0.1 userA 0.2 userB
# 比较时注意浮点误差
练习
1. 设计一个“日榜/周榜”排行榜,分别用两个 ZSet 维护,并给出查询前 10 名的命令。
2. 实现一个延时队列:每秒拉取到期任务并删除,写出完整命令序列。
3. 使用 ZCOUNT 统计 30~60 分区间用户数量,并验证结果。