统计UV数据 HyperLogLog

UV(独立访客):即Unique Visitor,访问网站的一台电脑客户端为一个访客,24小时内相同的客户端只被计算一次

用户量小,可以使用Redis的set集合来进行统计
每有1个请求,就用sadd将用户ID添加进去,然后通过scard取值,即为UV数据

如果一个页面有几千万的UV,就需要一个很大的set,很浪费空间
如果有十个或更多页面,怎么办?只是为了统计UV,就要用掉这么多空间,不值得
所以要用到Redis的HyperLogLog

基础命令

pfadd:新增
pfcount:获取总数

也可批量新增

pfmerge:数据合并

比如手机和显卡,都属于电子产品,那么它们的UV数据其实可以合并

缺点

HyperLogLog的缺点就是统计会有误差

1000条少了10条,再执行一遍,依旧少了10条,而且总数依然是990,说明可以去重

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
Jedis jedis = new Jedis();
for (int i = 0; i < 1000; i++) {
jedis.pfadd("userName", "xcr" + i);
}
long total = jedis.pfcount("userName");
System.out.println("1000 --- " + total);
jedis.close();
}
}

至于更大的数据量,可以自己去测试(服务器太辣鸡,一万条数据都插不进去…)
误差率不会太大,对于统计UV来说,并不影响

结语

只要用了HyperLogLog数据结构,它就要占用12k存储空间,它不适合统计单个用户的相关数据
至于什么时候用,海量用户,几亿,就用它,相比于set已经节约很多空间了

Redis对HyperLogLog进行了优化,用了稀疏矩阵存储
随着计数的变大,超过了阈值会变成稠密矩阵,才会占用12k存储空间


参考书籍:Redis 深度历险:核心原理与应用实践

------本文结束感谢阅读------

本文标题:统计UV数据 HyperLogLog

文章作者:churuo

原始链接:https://www.xuchuruo.cn/统计UV数据-HyperLogLog.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%