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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值