1.场景:需要统计一个网页的一天的访问量,同一个用户一天之内的多次访问请求只能计数一次
解决办法:为每一个页面一个独立的 set 集合来存储所有当天访问过此页面的用户 ID
缺陷:页面访问量非常大,使用一个很大的 set 集合来统计,这就非常浪费空间。如果这样的页面很多,那所需要的存储空间是惊人的
引入:Redis 提供了 HyperLogLog 数据结构就是用来解决这种统计问题的。HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81%
2.HyperLogLog使用方法
(1)两个指令pfadd 增加计数和pfcount 获取计数
(2)pfmerge,用于将多个pf 计数值累加在一起形成一个新的pf值
场景:网站中我们有两个内容差不多的页面,运营说需要这两个页面的访问量进行合并。pfmerge就可以派上用场了
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 user3
(integer) 1
127.0.0.1:6379> pfcount codehole
(integer) 3
127.0.0.1:6379> pfadd codehole user4 user5 user6 user7
(integer) 1
127.0.0.1:6379> pfcount codehole
(integer) 7
3.注意事项
HyperLogLog需要占据12k的存储空间,所以它不适合统计单个用户相关的数据。如果你的用户上亿,可以算算,这个空间成本是非常惊人的。但和set方案相比确真的是四两与千斤的比较。
redis对HyperLogLog的存储优化
在计数比较小时,它的存储空间采用稀疏矩阵存储,空间占用很小,仅仅在计数慢慢变大,稀疏矩阵占用空间渐渐超过了阈值时才会一次性转变成稠密矩阵,才会占用 12k 的空间
以上为学习《Redis深度历险核心原理和应用实践》笔记