集合基数与统计口径
SCARD 以 O(1) 返回 Set 的成员数,常用于规模监控、限流判空与精确 UV 统计。它与 HyperLogLog 的选择是精确与内存的取舍:Set 精确但内存随成员数线性增长,HyperLogLog 固定约 12KB 但有 0.81% 标准误差。
基本信息
| 适用 | Redis 1.0 及以上,Set 类型命令 |
|---|---|
| 复杂度 | O(1) |
| 键不存在时 | 返回 0 |
| 精度 | 精确计数,不存在误差 |
| 内存特点 | 随成员数线性增长,量级大时成本显著 |
示例与对比
示例与对比
SADD uv:20261012 u1 u2 u3 # 当天访问用户去重
SCARD uv:20261012 # 3:精确基数
SISMEMBER uv:20261012 u1 # 1:是否已统计过
SCARD uv:notexist # 0:键不存在返回 0
PFADD hll:uv:20261012 u1 u2 u3 # 近似方案的写入方式
PFCOUNT hll:uv:20261012 # 3:估算值,标准误差约 0.81%
EXPIRE uv:20261012 86400 # 统计类键务必设置过期,避免长期堆积精确与近似口径对比
| 维度 | Set + SCARD | HyperLogLog + PFCOUNT |
|---|---|---|
| 结果性质 | 精确 | 估算,标准误差约 0.81% |
| 内存占用 | 随成员数线性增长 | 固定约 12KB |
| 典型量级 | 百万级以内较从容 | 千万级乃至亿级 |
| 能否取成员 | 可以,SMEMBERS 遍历 | 不能,只输出基数 |
| 适用场景 | 需要精确值或需要成员明细 | 只要趋势与量级的统计 |
典型使用场景
- 日活或活动参与人数去重统计,规模不大时用精确计数
- 限流判空:集合为空说明没有在途任务,可做状态判断
- 配额类业务:统计已领取用户数并与上限比较
- 报表口径核对:对比 Set 精确值与 HyperLogLog 估算值的偏差
- 监控告警:集合规模突增说明可能存在异常刷量
UV 量级到千万以上时精确 Set 的内存成本会明显吃紧——每个用户一个成员;此时换 HyperLogLog,用 0.81% 的误差换固定内存。
统计类键如果长期不设过期,会随着日期不断新增而持续占用内存,务必配合 EXPIRE 与归档策略。
周边命令怎么选
- 判断单个成员是否存在用 SISMEMBER,SCARD 只给总量
- 只关心基数且量级很大时优先 HyperLogLog,稠密整数 ID 可用 Bitmap
- 统计值要与离线口径定期核对,避免重复计数长期无人发现
- 集合类键建议设置过期时间,长期堆积会持续占用内存