zoukankan      html  css  js  c++  java
  • 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,是合并多个统计结果。在合并过程中,会自动去重多个集合中的元素。

  • 相关阅读:
    使用 Promise.all 同时发起多个请求
    vite 开发 Cesium 程序最佳配置实践
    【linux学习】使用grep命令获取过滤的数据作为下个命令的入参
    记一次k8s depolyment失败处理
    powerdesigner导出excel数据字典
    vue 时间格式
    ASP.NET MVC4 跨域配置
    Win10系统中切换虚拟桌面的快捷键如何设置
    不顾一切最简NHinbernate配置并读写数据库
    Windows time_wait过多解决办法
  • 原文地址:https://www.cnblogs.com/javazl/p/12664107.html
Copyright © 2011-2022 走看看