*Redis ZCOUNT 命令
返回 Sorted Set 中 score 在指定范围内的成员数量。
*语法
ZCOUNT key min max
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Sorted Set 的键名 |
| min | Double/String | 是 | 最小 score |
| max | Double/String | 是 | 最大 score |
*返回值
| 条件 | 返回值 |
|---|---|
| key 存在 | score 范围内的成员数量(Integer) |
| key 不存在 | 0 |
*时间复杂度
O(log(N)),N 为成员数量。
*示例
> ZADD leaderboard 100 "p1" 200 "p2" 300 "p3" 400 "p4"
(integer) 4
> ZCOUNT leaderboard 150 350
(integer) 2
> ZCOUNT leaderboard -inf +inf
(integer) 4
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| WRONGTYPE Operation against a key holding the wrong kind of value | 对非 Sorted Set 类型执行 ZCOUNT | 使用 TYPE 命令确认 key 类型为 zset |
| 返回 0 但实际期望有数据 | min > max 导致范围颠倒 | 检查 min 和 max 的顺序,确保 min ≤ max |
| ERR min or max is not a float | score 范围传入非数字或非法无穷大表示 | 使用数字或 -inf/+inf 表示无穷大 |
*最佳实践
- 区间统计:统计分数段人数,如考试分数段统计。
配合 ZREMRANGEBYSCORE:先 ZCOUNT 估算清理数量,再执行清理。
开区间查询:使用
(150表示不包含 150,实现开区间统计。配合 ZRANGEBYSCORE 使用:ZCOUNT 快速估算后,再用 ZRANGEBYSCORE 获取具体成员。
*5. 数据类型校验:调用前使用 TYPE 命令确认 key 为 zset,避免 WRONGTYPE 错误。
*FAQ
Q1: ZCOUNT 是 O(1) 吗? A: 不是,是 O(log(N))。但比 ZRANGEBYSCORE 后数数量高效得多。
Q2: ZCOUNT 支持开区间吗?
A: 支持。使用 (min 或 (max 表示不包含边界值,如 ZCOUNT key (100 200。
Q3: ZCOUNT 返回 0 是 key 不存在还是范围无数据? A: 两种情况都返回 0。可用 EXISTS 区分。
Q4: 可以对非 Sorted Set 使用 ZCOUNT 吗? A: 不可以。对空 key 返回 0;对非 zset 类型返回 WRONGTYPE 错误。
Q5: ZCOUNT 和 ZCARD 有什么关系?
A: ZCOUNT key -inf +inf 等效于 ZCARD,但 ZCARD 是 O(1) 更推荐。