Redis用HyperLogLog统计UV的核心是:按时间或页面维度建key、用pfadd记录用户标识、用pfcount读取估算值;它仅占12KB内存,误差率约0.81%,适合亿级场景。

Redis 用 HyperLogLog 统计网页 UV,核心就三点:按时间或页面维度建 key、用 pfadd 记录用户标识、用 pfcount 读取估算值。它不存原始数据,只占固定 12KB 内存,误差率约 0.81%,适合日活百万甚至亿级的场景。
按业务粒度设计 Key
UV 统计必须和业务时间、页面强绑定,否则无法区分“今天首页”和“昨天详情页”。常见做法是把日期、页面路径、设备类型等拼成唯一 key:
- 单日单页 UV:
uv:page:home:20260806 - 单日全站 UV:
uv:site:20260806 - 带渠道区分:
uv:page:product:ios:20260806
Key 命名要统一、可读、便于清理(比如用 TTL 设置过期,或定时删除旧 key)。
添加用户标识用 pfadd
每次用户访问页面时,拿到其唯一标识(如用户 ID、设备 ID 或脱敏后的 Cookie),执行:
pfadd uv:page:home:20260806 user_12345
注意:
- 同一个用户当天多次访问,只会算作 1 次,pfadd 自动去重
- 支持一次添加多个标识:
pfadd uv:page:home:20260806 u1 u2 u3 - 返回值为 1 表示至少有一个新元素被加入,0 表示本次所有元素都已存在
获取 UV 数值用 pfcount
想查当天首页独立访客数,直接执行:
pfcount uv:page:home:20260806
返回的是估算值,例如返回 (integer) 872419,实际真实值在 ±0.81% 范围内(即约 865,000–880,000 之间)。如果要查多天合并 UV(比如近 7 天去重总人数),可先用 pfmerge 合并多个 key,再 pfcount:
pfmerge uv:week:20260806 uv:page:home:20260801 uv:page:home:20260802 ...pfcount uv:week:20260806
配套操作与注意事项
HyperLogLog 不是万能的,用对才能发挥价值:
- 不能反查用户列表:它只存统计摘要,无法取出具体有哪些 user_id
- 不支持精确去重验证:若业务要求绝对准确(如财务结算),需另走离线计算流程
-
建议搭配 TTL 使用:比如设置
EXPIRE uv:page:home:20260806 86400,避免无效 key 占内存 - Java/SpringBoot 中推荐用 RedisTemplate.opsForHyperLogLog(),封装 add() 和 size() 方法,比原生命令更易维护


















