首页/数据/数据库速查/SCARD 集合基数
Redis 命令96 条

SCARD 集合基数

O(1) 返回集合成员数;用作规模监控、限流判空与「UV 统计」的精确计数(与 HyperLogLog 的估算对比)。

数据库速查数据更新于 2026-10-13

集合基数与统计口径

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 + SCARDHyperLogLog + PFCOUNT
结果性质精确估算,标准误差约 0.81%
内存占用随成员数线性增长固定约 12KB
典型量级百万级以内较从容千万级乃至亿级
能否取成员可以,SMEMBERS 遍历不能,只输出基数
适用场景需要精确值或需要成员明细只要趋势与量级的统计

典型使用场景

  • 日活或活动参与人数去重统计,规模不大时用精确计数
  • 限流判空:集合为空说明没有在途任务,可做状态判断
  • 配额类业务:统计已领取用户数并与上限比较
  • 报表口径核对:对比 Set 精确值与 HyperLogLog 估算值的偏差
  • 监控告警:集合规模突增说明可能存在异常刷量
UV 量级到千万以上时精确 Set 的内存成本会明显吃紧——每个用户一个成员;此时换 HyperLogLog,用 0.81% 的误差换固定内存。
统计类键如果长期不设过期,会随着日期不断新增而持续占用内存,务必配合 EXPIRE 与归档策略。

周边命令怎么选

  • 判断单个成员是否存在用 SISMEMBER,SCARD 只给总量
  • 只关心基数且量级很大时优先 HyperLogLog,稠密整数 ID 可用 Bitmap
  • 统计值要与离线口径定期核对,避免重复计数长期无人发现
  • 集合类键建议设置过期时间,长期堆积会持续占用内存

易错点

  • 千万级 UV 用 Set 精确统计:单键内存可达数百 MB,本身就是大 key 问题
  • 把 PFCOUNT 的结果当精确值对外展示:存在标准误差,报表口径要说明清楚
  • 统计键忘记过期:按天累积的键越来越多,内存缓慢泄漏且不易察觉
  • 用 SCARD 判断业务是否存在数据:键不存在也返回 0,需结合 EXISTS 区分空集与无键

数据来源与参考

  • Redis 官方文档: SCARD
  • Redis 官方文档: HyperLogLog

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌