*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 表示无穷大

*最佳实践

  1. 区间统计:统计分数段人数,如考试分数段统计。
  2. 配合 ZREMRANGEBYSCORE:先 ZCOUNT 估算清理数量,再执行清理。

  3. 开区间查询:使用 (150 表示不包含 150,实现开区间统计。

  4. 配合 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,但 ZCARDO(1) 更推荐。