*Redis PFADD 命令

PFADD 将元素添加到 HyperLogLog 数据结构中,用于基数估算。


*语法

PFADD key element [element ...]

*参数说明

参数 类型 必填 说明
key String HyperLogLog 键名
element String 要添加的元素,支持多个

*返回值

  • 1:HyperLogLog 内部被修改(至少有一个新元素被添加)
  • 0:内部估计值未发生变化(所有元素已存在)
  • 如果 key 不存在,会自动创建空的 HyperLogLog 结构

*时间复杂度

O(1) 每个元素。添加 N 个元素为 O(N)。


*示例

*基本用法

> PFADD hll user1
(integer) 1
> PFADD hll user2 user3
(integer) 1
> PFCOUNT hll
(integer) 3

*重复元素不增加计数

> PFADD hll user1
(integer) 0
> PFCOUNT hll
(integer) 3

*批量添加元素

> PFADD visitors page1 page2 page3 page4 page5
(integer) 1
> PFCOUNT visitors
(integer) 5

*常见错误

错误 原因 解决
ERR wrong number of arguments 未提供 key 或 element 至少提供 key 和一个 element
WRONGTYPE key 已存在且不是 HyperLogLog 删除或改用其他 key

*最佳实践

  • 适合大规模 UV 统计、去重计数等允许近似结果的(误差率约 0.81%)场景
  • 单个 HyperLogLog 固定使用 12KB 内存,与元素数量无关,极度内存高效
  • 不支持删除元素,如需删除需重建整个 HyperLogLog
  • 使用 PFMERGE 合并多个 HyperLogLog 实现多维度聚合统计

*FAQ

Q1: PFADD 的计数是精确的吗? A: 不是精确计数。HyperLogLog 是概率算法,标准误差约 0.81%。对于绝大多数统计场景,该精度足够。

Q2: 为什么返回 1 但 PFCOUNT 没有增加? A: 返回 1 表示内部结构被修改,但 HyperLogLog 的计数是概率估算,某些添加可能不影响估算值( especially for small counts)。当计数较小时(< 10),PFADD 可能返回 1 但 PFCOUNT 不变,这是正常行为。

Q3: HyperLogLog 占用多少内存? A: 固定约 12 KB,无论存储多少元素。这是 HyperLogLog 的核心优势——以固定内存实现大规模基数估算。