ZREM 与区间删除
ZREM 按成员名删除,返回实际删除的数量;ZREMRANGEBYRANK 与 ZREMRANGEBYSCORE 则按区间批量清理,一个按名次、一个按分数。后两者是维护榜单与过期数据的主力:把时间戳当分数,用 ZREMRANGEBYSCORE 清理早于某个时刻的成员,就实现了「只保留最近若干天」的数据保留策略。
基本信息
| ZREM | 按成员名删除,返回实际删除数 |
|---|---|
| ZREMRANGEBYRANK | 按名次区间删除,例如清掉末尾成员 |
| ZREMRANGEBYSCORE | 按分数区间删除,常用于时间窗口清理 |
| 区间写法 | -inf 与 +inf 表示无界,左括号表示开区间 |
| 性能注意 | 一次性删除超大区间会阻塞单线程 |
典型使用场景
- 清理榜单里已知的异常成员
- 按时间窗口删除历史数据,只保留最近若干天
- 截断榜单末尾,控制集合规模
- 清理测试期写入的脏数据
- 配合延时队列清理已完成的过期任务
删除与区间清理
删除与区间清理
ZADD log 100 t1 200 t2 300 t3 400 t4
ZREM log t1 # 1
ZREM log t1 t2 # 1:t1 已删除,只统计实际删除的
ZREMRANGEBYSCORE log 0 250 # 1:按分数区间清理
ZREMRANGEBYRANK log 0 0 # 1:删除名次最低的一个
ZREMRANGEBYSCORE log -inf +inf # 全清
# 只保留最近 7 天(分数为秒级时间戳):
ZREMRANGEBYSCORE log -inf (1700000000删除依据对照
| 命令 | 删除依据 | 典型用途 |
|---|---|---|
| ZREM | 按成员名 | 删除已知的异常或指定成员 |
| ZREMRANGEBYRANK | 按名次区间 | 截断榜单末尾或清理首尾 |
| ZREMRANGEBYSCORE | 按分数区间 | 时间窗口清理 |
| 左括号写法 | 开区间,不包含该值 | 让时间窗口边界更精确 |
| -inf 与 +inf | 无界 | 整体清空或从头清理 |
「时间戳作分数,再用 ZREMRANGEBYSCORE 清理到截止点」是标准的数据保留策略,实现简单,配合一个定时任务就能长期稳定运行。清理时把截止点写成开区间(加左括号)可以避免误删边界那一秒的数据。
一次删除上百万成员的大区间会阻塞单线程数百毫秒:应当分批删除,例如每次限量清理一段,或用后台任务逐步推进,把影响摊到多个时间点。
BYRANK 与 BYSCORE 极容易弄混:一个按名次、一个按分数。删错方向的数据不可逆,动手前先用 ZRANGE 或 ZRANGEBYSCORE 确认要删的到底是哪些成员。