HyperLogLog在redis中的使用

一般我们评估一个网站,主要有两个指标

  1. pv(page, view),页面访问量
  2. uv(user,view),访问的用户

一般来说,pv和uv的 统计可以自己来做,也可以借助第三方工具。

自己如何实现:pv;可以通过计数器,key的话加上当前的日期,每当有用户请求的时候,hincrby自增一次,就实现了。但是uv的话,要处理另一个问题,就是去重:

       如何去重:需要前端每个用户生成唯一的id,无论是登录还是未登录,都需要一个唯一id,伴随着请求一起到达祸端,在后端,通过sadd,set集合去处理,因为set集合存储的话,是不能存重复的。然后通过scard统计集合的大小。进而得出uv数据。

但是如果有千万个uv,需要的存储空间是非常惊人的,像这种数量特别多的用户访问量的话,以便不需要特别精确。

所以可以使用HyperLogLog去数据类型去统计:

在redis中提供了HyperLogLog,就是专门解决这个问题的,但是不怎么精确,会有误差,误差数据为0.81%。

HyperLogLog一共提供了两个命令:pfadd,和pfcount

它的使用;

public class HyperLogLog {
    public static void main(String[] args) {
        Redis redis = new Redis();
        redis.execute(jedis -> {
            for (int i = 0; i < 1000; i++) {
                jedis.pfadd("uv", "u" + i, "u" + (i + 1));
           }
            long uv = jedis.pfcount("uv");
            System.out.println(uv);//理论值是 1001
       });
   }
}

实际打印出来是994.

除了前两个命令,还有一个命令pfmerge,是合并多个统计结果。在合并过程中,会自动去重多个集合中的元素。

posted @ 2020-04-09 09:05  繁华乱世  阅读(344)  评论(0编辑  收藏  举报