010-redis应用-03- HyperLogLog
一、概述
Redis 提供了 HyperLogLog 数据结构就是用来解决 这种统计问题的。HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不 精确,标准误差是 0.81%
HyperLogLog 数据结构是 Redis 的高级数据结构
1.1、统计pv、uv
可以使用的数据结构:incrby、以及集合set操作,但是性能是比较高的,针对可以有误差的情况下。可以使用HyperLogLog 提供了两个指令 pfadd 和 pfcount
1.2、基础使用
HyperLogLog 提供了两个指令 pfadd 和 pfcount,一个是增加计数,一个是获取计数。pfadd 用法和 set 集合的 sadd 是一样的。pfcount 和 scard 用法是一样的,直接获取计数值。
127.0.0.1:6379> pfadd codehole user1 (integer) 1 127.0.0.1:6379> pfcount codehole (integer) 1 127.0.0.1:6379> pfadd codehole user2 (integer) 1 127.0.0.1:6379> pfcount codehole (integer) 2 127.0.0.1:6379> pfadd codehole user1 user2 user3 user4 (integer) 1 127.0.0.1:6379> pfcount codehole (integer) 4
1.3、pfmerge 适用场合
HyperLogLog 除了上面的 pfadd 和 pfcount 之外,还提供了第三个指令 pfmerge,用于 将多个 pf 计数值累加在一起形成一个新的 pf 值。
1.4、空间占用
HyperLogLog 这个数据结构要占据一定 12k 的存储空间,所以它不适合统计单个用户相关的数据。
如果你的用户上亿,可以算算,这个空间成本是非常惊人的。但是相比 set 存储方案,HyperLogLog 所使用的空间是非常小的。
Redis 对 HyperLogLog 的存储进行了优化,在计数比较 小时,它的存储空间采用稀疏矩阵存储,空间占用很小,仅仅在计数慢慢变大,稀疏矩阵占 用空间渐渐超过了阈值时才会一次性转变成稠密矩阵,才会占用 12k 的空间。
1.5、HyperLogLog 实现原理
……
pf 的内存占用为什么是 12k
Redis 的 HyperLogLog 实现中用到的是 16384 个桶,也就是 2^14,每个桶的 maxbits 需要 6 个 bits 来存储,最 大可以表示 maxbits=63,于是总共占用内存就是 2^14 * 6 / 8 = 12k 字节。