使用Redis统计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,说明可以去重

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 深度历险:核心原理与应用实践

发布了19 篇原创文章 · 获赞 5 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/a243293719/article/details/89377317