当前位置: 首页 > article >正文

Redis --- 使用HyperLogLog实现UV(访客量)

UVPV 是网站或应用数据分析中的常用指标,用于衡量用户活跃度和页面访问量。


    UV (Unique Visitor 独立访客)

    • 指的是在一定时间内访问过网站或应用的独立用户数量
    • 通常根据用户的 IP 地址、Cookies 或用户 ID 等来唯一标识一个用户。
    • 示例:同一个用户访问页面 3 次,仍然算作 1 个 UV。

    PV (Page View 页面访问量)

    • 指的是某个页面在一定时间内被访问的次数
    • 每次页面加载或刷新都会计为一次 PV。
    • 示例:如果一个用户打开页面并刷新 3 次,那么这 3 次都算作 3 次 PV。

    UV 是统计独立访客的数量,我们可以通过 Redis 的 Set 数据结构来实现。Set 是一个不允许重复的集合,因此可以利用这一特性避免重复计数。但是如果用户量非常大,使用 Set 来存储用户 ID 会消耗很多内存,这时可以使用 Redis 提供的 HyperLogLog 数据结构来估算 UV

    HyperLogLog 用于基数统计,能够以非常低的内存消耗计算大规模数据的基数(如独立访客数)。然而,它不会像 Set 一样准确存储所有数据,而是使用概率统计来给出一个近似值,误差通常小于 0.81% 左右,所以我们通常使用其来统计UV。 逐个存储(一个一个存储)元素到 HyperLogLog 会在某些情况下增加误差。

    Redis 提供的 HyperLogLog 命令

    • PFADD key element [element ...]:向 HyperLogLog 数据结构添加元素,Redis 将会使用这些元素估算基数。
    • PFCOUNT key [key ...]:返回一个或多个 HyperLogLog 估算的基数。

    使用 HyperLogLog 估算独立访客数(UV): 

    String userKey = "page:uv:homepage";
    String userId = "user123";  // 用户唯一标识
    jedis.pfadd(userKey, userId);  // 将用户 ID 添加到 HyperLogLog 中
    

     查询估算的 UV 数量:

    Long uvEstimate = jedis.pfcount("page:uv:homepage");
    System.out.println("估算的独立访客数:" + uvEstimate);
    

    使用 HyperLogLog 进行 UV 估算时,内存消耗较少,但是由于其是基于概率算法,因此存在一定的误差,适合用于大规模数据分析。

    @SpringBootTest
    public class HmDianPingApplicationTests {
        @Resource
        private StringRedisTemplate stringRedisTemplate;
        @Test
        public void hyperLogLogTest(){
            // 模拟庞大数据
            String[] values = new String[1000];
            int j = 0;
            for(int i = 0; i < 1000000; i++){
                j = i % 1000;
                values[j] = "user_" + i;
                if(j == 999) {
                    // 发送到Redis中
                    stringRedisTemplate.opsForHyperLogLog().add("hl2",values);
                }
            }
            // 统计数量
            Long count = stringRedisTemplate.opsForHyperLogLog().size("hl2");
            System.out.println(count);
        }
    
    }
    

    而HyperLogLog 不适合计算 PV,因为 PV 需要精确计数每一次页面访问,而 HyperLogLog 只用于估算基数。计算 PV 应该使用 Redis 的 String 类型,并通过 INCRINCRBY 命令来增加访问计数。


    HyperLogLog 是一种高效的基数估算方法,适用于大数据量场景,能够以非常低的内存消耗提供基数(UV)估算。而 PV 则需要精确计数,因此需要使用字符串计数器。逐个存储(一个一个存储)元素到 HyperLogLog 会在某些情况下增加误差。


    http://www.kler.cn/a/537982.html

    相关文章:

  • Django项目中创建app并快速上手(pycharm Windows)
  • CMake 小知识:CMAKE_INSTALL_PREFIX 与 option 变量的覆盖规则
  • DeepSeek之Win10系统部署教程
  • 【STM32F1】一种使用通用定时器实现各个通道独立输出不同指定数量脉冲的方法
  • C#中的Dump:解锁程序调试新姿势
  • 完美解决phpstudy安装后mysql无法启动
  • B树详解及其C语言实现
  • java 读取sq3所有表数据到objectNode
  • 使用TensorFlow和Keras构建卷积神经网络:图像分类实战指南
  • Maven插件—代码规范格式化spotless-maven-plugin
  • 记录虚拟机安装银河麒麟V10系统中遇到的一些问题
  • 深度学习和机器学习的区别|自注意力机制和多头注意力机制的展示|售前面试题
  • 从长尾关键词到页面优化,打造完整的SEO策略
  • 泛微OA E-Cology /messager/users.data 信息泄漏漏洞
  • Java 一键将 Word 文档转为 PDF
  • Open3d Qt的环境配置
  • DeepSeek-R1 云环境搭建部署流程
  • Vue笔记(四)
  • neo4j-解决导入数据后出现:Database ‘xxxx‘ is unavailable. Run :sysinfo for more info.
  • 仅128个token达到ImageNet生成SOTA性能!MAETok:有效的扩散模型的关键是什么?(卡内基梅隆港大等)
  • STM32系统架构介绍
  • Swift语言的面向对象编程
  • 腾讯云助力 DeepSeek R1 一键部署
  • Heterogeneous Graph Attention Network(HAN)
  • 【机器学习案列】基于XGBoost的睡眠时间预测
  • Redis深入学习