点评项目最后一篇:基于HyperLogLog实现UV统计

news2024/11/18 9:26:20

文章目录

    • 1 HyperLogLog
    • 2 测试百万数据的统计

1 HyperLogLog

首先我们搞懂两个概念:

  • UV:全称Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站,只记录1次。
  • PV:全称Page View,也叫页面访问量或点击量,用户每访问网站的一个页面,记录1次PV,用户多次打开页面,则记录多次PV。往往用来衡量网站的流量。

通常来说UV会比PV大很多,所以衡量同一个网站的访问量,我们需要综合考虑很多因素,所以我们只是单纯的把这两个值作为一个参考值

UV统计在服务端做会比较麻烦,因为要判断该用户是否已经统计过了,需要将统计过的用户信息保存。但是如果每个访问的用户都保存到Redis中,数据量会非常恐怖,那怎么处理呢?

Hyperloglog(HLL)是从Loglog算法派生的概率算法,用于确定非常大的集合的基数,而不需要存储其所有值。相关算法原理大家可以参考:https://juejin.cn/post/6844903785744056333
Redis中的HLL是基于string结构实现的,单个HLL的内存永远小于16kb内存占用低的令人发指!作为代价,其测量结果是概率性的,有小于0.81%的误差。不过对于UV统计来说,这完全可以忽略。

具体实现方式是,为每个时间点或者日期等维度创建一个独立的HyperLogLog对象,在记录用户的UV时,先将用户ID或IP等信息进行哈希处理得到一个指纹(fingerprint),然后利用Redis提供的PFADD命令将这个指纹添加进对应的HyperLogLog集合中。当需要统计某一维度的UV时,使用PFCOUNT命令获取对应HyperLogLog集合的基数(cardinality),即该维度下的独立访问者数量。

1653837988985

2 测试百万数据的统计

测试思路:我们直接利用单元测试,向HyperLogLog中添加100万条数据,看看内存占用和统计效果如何

@Test
void testHyperLogLog() {
    // 准备数组装用户数据
    String[] values = new String[1000];
    // 数组角标
    int j = 0;
    for (int i = 0; i < 1000000; i++) {
        j = i % 1000;
        // 赋值
        values[j] = "user_" + i;
        // 每1000条发送一次
        if(j == 999){
            // 发送到 Redis
            stringRedisTemplate.opsForHyperLogLog().add("hl2", values);
        }
    }
    // 统计数量
    Long count = stringRedisTemplate.opsForHyperLogLog().size("hl2");
    System.out.println("count = " + count);
}

经过测试:我们会发生他的误差是在允许范围内,并且内存占用极小

image-20230508173534258

整个项目完整版代码开源在 cs001020/hmdp: 黑马点评 (github.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/503039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无线键盘有几种连接方式?(USB接收器连接(无线2.4g)、蓝牙连接、wi-fi连接、红外线连接)

文章目录 无线键盘有哪几种连接方式&#xff1f;各连接方式优缺点 无线键盘有哪几种连接方式&#xff1f; 无线键盘有以下几种连接方式&#xff1a; 通过USB接收器连接&#xff08;无线2.4g&#xff09;&#xff1a;无线键盘通过USB接收器与电脑连接&#xff0c;一般需要插入电…

3W字吃透:微服务 sentinel 限流 底层原理和实操

40岁老架构师尼恩的掏心窝&#xff1a; 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社群中&#xff08;50&#xff09;&#xff0c;很多小伙伴凭借 “左手云原生 右手大数据 SpringCloud Alibaba 微服务“三大绝活&#xff0c;拿…

MySQL 数据库 增删查改、克隆、外键 等操作

数据库中有数据表&#xff0c;数据表中有一条一条的记录。 可以用Navicat 等远程连接工具链接数据库&#xff0c;不过数据库需要开启授权。 SQL 字段数据类型 int&#xff1a;整型&#xff0c;默认长度是11 float&#xff1a;单精度浮点&#xff0c;4字节32位 double&#x…

Kyligence Zen产品体验-让大数据分析更轻松

很高兴有机会为大家分享我对 Kyligence Zen 产品的真实体验。在过去的几周中&#xff0c;我花费了大量时间使用这个企业级指标平台&#xff0c;并发现它在帮助企业处理和分析海量数据方面拥有强大的能力。 作为数据分析师&#xff0c;我们经常需要处理和分析大量的数据。这可能…

K8S管理系统项目实战[前端开发]-1

前端 Vue 入门与进阶 Vue ElementPlus 组件库 K8s管理系统项目实战[前端开发]-1 项目概述、框架搭建 Vue前端开发&#xff1a;整体布局 Vue前端开发&#xff1a;工作流 Vue前端开发&#xff1a;登录登出、部署、总结 一、项目慨述 本节是k8s管理系统项目实战的前端开发…

Endnote引用中文、英文参考文献方法(不用手敲中文文献信息)

目录 引用英文参考文献 插入中文参考文献格式 导入出错的解决方案 引用英文参考文献 打开知网的官网&#xff0c;选择想要导出成endnote格式的文献&#xff08;在文献前面打√&#xff0c;即为选中状态&#xff09;&#xff0c;在导出与分析-导出文献-endnote&#xff0c;即…

配置Visual Studio Code连接远程服务器

目录 一、Windows用户需要先配置好本地的Remote SSH相关服务 二、打开VS Code&#xff0c;在扩展中搜索"Remote - SSH"并安装​编辑 三、详细操作 四、在出现的config配置文件中写入以下信息 五、点击VSCode界面最左侧的远程资源管理器 六、输入密码&#xff0…

记录一个特殊场景下,修改代码,idea 需要 mvn clean install的问题

修改java代码&#xff0c;mvn clean install 才能生效的场景&#xff0c;在网上看到一些方法&#xff0c;但是都没有生效。eg: 删除.idea&#xff0c; 删除后重新导入。每次修改代码测试的时候都要手动 clean install才可以&#xff0c;比较麻烦。 跑代码的时候&#xff0c;自…

HALCON多线程框架

1.整体架构 HALCON多线程处理框架基本思想是单独一个线程获取待处理图像&#xff0c;若干个图像处理线程并行执行 2.架构图 3.HALCON多线程并行相关算子 broadcast_condition clear_barrier clear_condition clear_event clear_message clear_message_queue clear_mutex cre…

Mac 安装 Python3.10 和 配置环境

Mac 安装 Python3.10 并且配置环境 一、Python的安装 访问官网&#xff1a;https://www.python.org/选择系统&#xff08;Mac&#xff09;: [https://www.python.org/downloads/macos/] 3.选择一个版本下载。我这里选择了3.10.X 下载页面&#xff1a;https://www.python.or…

Qt Creator 快捷键

一、快捷键 下面是Qt常用快捷键用法&#xff0c;如下&#xff1a; 1、构建 快捷键功能ctrl/注释ctrlr运行ctrlb编译 2、查找 快捷键功能ctrlf单文件查找ctrlshiftf多文件查找ctrlshiftu查找所有使用该符号的地方&#xff08;先选中某个符号&#xff0c;执行快捷键&#xff0…

句子扩写软件-文案扩写软件

什么是扩写软件 扩写软件是一种工具&#xff0c;可以帮助用户对一段文本进行扩展&#xff0c;增加文本的长度和信息量&#xff0c;同时保持原始内容的基本意思和结构不变。简单来说&#xff0c;扩写软件就是通过自然语言处理技术&#xff0c;对原始文本进行修改或补充&#xf…

搭建一个SpringSecurity项目

首先需要有一点的SpringBoot基础再来搭建会更好一点 springsecurity项目主要用于权限&#xff0c;验证等操作&#xff0c;非常方便 选择新建项目——选择spring Initializr项目 相对应的设置大家可以自行设置然后点击下一步 这里我选择两个依赖&#xff0c;也不用过多&#xff…

java实现mysql两个数据库对比表结构是否一致

【使用场景】 本地开发完后&#xff0c;增加或者删除了字段&#xff0c;或者修改了字段属性。 如何判定现场环境和本地环境的数据表结构一致性&#xff1f; 肉眼看的话&#xff0c;实在是一个大的工作量&#xff0c;所以开发了此工具。 【类存放路径】 CompareDbMain是主函数…

Spring更简单的存取Bean

在上一篇blog里边我介绍了spring项目的创建以及Bean对象的存储和读取。 存储&#xff1a;1.首先创建Bean对象 2.将Bean对象注册到Spring容器中【Bean标签】 读取&#xff1a;1.获取Spring上下文对象 2.获取指定的Bean对象 3.使用Bean对象 但是随着Bean对象的增多以及使用频率的…

【面试】Java 反射机制(常见面试题)

文章目录 前言一、反射是什么&#xff1f;二、为什么要有反射三、反射 API3.1 获取 Class 对象的三种方式3.2 获取成员变量3.3 获取构造方法3.4.获取非构造方法 四、实践五、常见面试题5.1. 什么是反射&#xff1f;5.2. 哪里用到反射机制&#xff1f;5.3. 什么叫对象序列化&…

IDEA沉浸式编程体验

前言 IntelliJ IDEA:前不久推出了一个新的概念Fleet编辑器。用过的人都知道&#xff0c;不过是模仿VScode整一套&#xff0c;但相比之下&#xff0c;fleet虽然在传统IDEA的基础上简约了不少&#xff0c;一旦打开智能模式&#xff0c;那内存占用刷一下就上去了&#xff0c;没个3…

Apache Atlas(1):Atlas 入门

1 Atlas 概述 Apache Atlas 为组织提供开放式元数据管理和治理功能&#xff0c;用以构建其数据资产目录&#xff0c;对这些资产进行分类和管理&#xff0c;形成数据字典。并为数据分析师和数据治理团队&#xff0c;提供围绕这些数据资产的协作功能。 注&#xff1a;数据字典&…

SpringBoot3 integrate SpringDoc

SpringDoc 官方文档 Springdoc3取代swagger2 pom xml加载Springdoc JarOpenAPIDefinition&#xff0c;声明一个OpenAPI对API进行分组&#xff0c;方便查询访问地址springdoc ConfigurationRequestMapping pom xml加载Springdoc Jar <dependency><groupId>org.sprin…

记录idea插件wl spring assistant plugin的坑-不提示配置项,显示黑树叶

某一天在编写springboot项目的配置文件是&#xff0c;提示我按照插件wl spring assistant。 然后手贱&#xff0c;就安装了。 等第二天在编写配置文件的时候&#xff0c;就遇到了大坑&#xff0c;配置文件无法提示了。 正常情况下&#xff1a; 比如我们输入mybatis-plus的log&a…