ZCARD 与 ZCOUNT 是什么
ZCARD 返回有序集合的成员总数,复杂度 O(1);ZCOUNT 返回分数落在指定区间内的成员数,复杂度 O(log N)。两者都不返回成员本身,只做规模统计,是监控大盘、限流判断与「窗口内有多少条」的标准入口。
基本信息
| ZCARD | 有序集合成员总数,O(1) |
|---|---|
| ZCOUNT | 分数区间内的成员数,O(log N) |
| 区间标记 | 默认闭区间,前置圆括号表示开区间,如 (150 |
| 无穷端点 | -inf 与 +inf 表示负无穷与正无穷 |
| 相关命令 | ZLEXCOUNT 按字典序区间统计成员数 |
典型使用场景
- 监控大盘:定时采集排行榜或队列的规模,画趋势图
- 滑动窗口限流:分数存请求时间戳,用 ZCOUNT 统计窗口内请求数
- 到期任务统计:分数存到期时间,统计即将到期的任务有多少
- 排行榜参与度:统计分数高于某个门槛的成员数量,用于发奖口径核对
- 延迟队列水位:统计区间任务数,判断消费能力是否跟得上生产速度
统计示例
统计示例
ZADD board 100 u1 200 u2 300 u3
ZCARD board # 3,成员总数
ZCOUNT board 150 350 # 分数 150 到 350 的成员数
ZCOUNT board -inf +inf # 等于 ZCARD
ZCOUNT board (150 +inf # 大于 150 的成员数,圆括号表示开区间
# 时间戳做滑动窗口:统计最近 60 秒的请求数
ZCOUNT rate:u1 $(( $(date +%s%3N) - 60000 )) +inf输出逐列读法
| 结果 | 含义 | 注意 |
|---|---|---|
| 整数 | 满足条件的成员数量 | 键不存在时返回 0,不报错 |
| 0 | 区间内没有成员或键不存在 | 与键类型错误要区分开 |
| 错误返回 | 对非有序集合执行会报类型错误 | 先确认键类型再统计 |
滑动窗口限流的经典实现:ZREMRANGEBYSCORE 清理过期成员、ZADD 写入当前请求、ZCARD 或 ZCOUNT 判断窗口内数量,三步用 Lua 保证原子。
ZCOUNT 的边界是闭区间,判断「大于 150」必须写成 (150,漏掉圆括号会多算边界成员。
选择建议
- 只问总数用 ZCARD,它不遍历任何成员,性能与集合大小无关
- 问区间用量 ZCOUNT,分数必须能比较大小,字符串编码的分数要先用整数
- 只需要「是否存在交集」这类布尔判断:配合 LIMIT 参数可以提前停止计算