ZRANGEBYSCORE 与 ZCOUNT 是什么
ZRANGEBYSCORE 按分数区间升序取成员,支持开区间语法(值前加括号表示不含边界)与正负无穷,还能用 LIMIT 做分页;ZCOUNT 只统计区间内的成员个数,不返回成员内容。区间是否包含边界完全由括号决定,写错会多出或少掉边界元素,这是最常见的误用。
基本信息
| 语法 | ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] |
|---|---|
| 开区间 | 值前加括号,如 (100 表示大于 100 |
| 无穷标记 | -inf 与 +inf 分别表示负无穷与正无穷 |
| 计数命令 | ZCOUNT key min max,仅返回个数 |
| 排序方向 | 本命令升序;倒序用 ZREVRANGEBYSCORE |
典型使用场景
- 分数段取数:取成绩、价格或评分某区间的成员
- 延迟任务:用执行时间戳作分数,取已到期的任务
- 分页导出:用 LIMIT 逐步导出区间数据
- 区间统计:ZCOUNT 算某分数段人数,用于看板
- 巡检核对:确认某区间是否有异常多的成员
- 滑动窗口:按时间戳区间统计最近 N 分钟的行为
示例
示例
ZADD log 100 t1 200 t2 300 t3 400 t4
ZRANGEBYSCORE log 100 300 # 返回 t1 t2 t3,包含两端
ZRANGEBYSCORE log (100 300 # 返回 t2 t3,左端不含
ZRANGEBYSCORE log -inf +inf WITHSCORES
ZRANGEBYSCORE log 100 400 LIMIT 1 2 # 分页:跳过 1 个取 2 个
ZCOUNT log 100 300 # 返回 3,只统计个数
ZREVRANGEBYSCORE log +inf -inf LIMIT 0 10 # 倒序取前 10
ZRANGEBYSCORE log 1758000000 +inf LIMIT 0 100 # 时间戳分数取到期任务语法片段读法
| 写法 | 含义 | 误用后果 |
|---|---|---|
| 100 | 包含边界 100 | 与 (100 混用时多出边界成员 |
| (100 | 不包含 100 | 想要包含却写了括号会漏掉成员 |
| -inf / +inf | 负无穷与正无穷 | 写成 0 会错误截断区间 |
| LIMIT offset count | 跳过 offset 个再取 count 个 | 与排名分页混用会重复取数 |
用时间戳分数做范围查询(最近 N 分钟日志)时,offset 会随新数据写入不断漂移,游标式翻页比按页码翻页更稳定。
LIMIT 的 offset 仍按偏移逐条扫描,深分页效率低;已知下次起始分数时直接以该分数为 min 继续取,比分页偏移更高效。
区间查询配合 ZREMRANGEBYSCORE 可以做周期性清理:例如取完已到期的任务后立即删除,避免集合无限增长;清理范围要按已确认处理完成的区间来定。