Redis HyperLogLog

7/29/2021 Redis

# 一:前言

统计PV,每个页面一个单独的Redis计数器,这个计数器的key后缀加上当天的日期。这样来一个请求,incrby 一次,最终就可以统计出所有的 PV 数据。

统计UV,需要去重。同一个用户一天之内的多次访问请求只能计数一次。HyperLogLog提供不准确的去重计数方案。虽然不精确但是也不是非常不精确,标准误差是 0.81%

HyperLogLog 并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog 可以利用极小的内存空间完成独立总数的统计,数据集可以是IP、Email、ID等

# 二:使用

  • pfadd key element [element …]:增加计数,用法和 set 集合的 sadd 是一样的,成功返回1
  • pfcount key [key …]:获取计数,用法和 scard 是一样的
  • pfmerge destkey sourcekey [sourcekey ...]:用于将多个 pf 计数值累加在一起形成一个新的 pf 值
> pfadd ccj1 user1
(integer) 1
> pfadd ccj1 user1 user2 user3 user4
(integer) 1
> pfcount ccj1
(integer) 4
> pfadd ccj2 user1 user5 user6
(integer) 1
> pfcount ccj2
(integer) 3
> pfmerge ccj3 ccj1 ccj2
OK
> pfcount ccj3
(integer) 6
1
2
3
4
5
6
7
8
9
10
11
12
13
14

pfadd 的 pf 是 HyperLogLog 算法发明人 Philippe Flajolet 的首字母缩写

# 三:存储大小

它需要占据一定 12k 的存储空间,所以它不适合统计单个用户相关的数据。如果用户上亿,可以算算,这个空间成本是非常惊人的。但相比使用 set 存储,HyperLogLog所使用的空间就非常小了

不过不必过于当心,因为 Redis 对 HyperLogLog 的存储进行了优化,在计数比较小时,它的存储空间采用稀疏矩阵存储,空间占用很小,仅仅在计数慢慢变大,稀疏矩阵占用空间渐渐超过了阈值时才会一次性转变成稠密矩阵,才会占用 12k 的空间。

# 四:实现原理

待完善

# 五:参考文献

最后更新: 12/26/2023, 4:16:14 PM