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 {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Testpublic 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.mzph.cn/bicheng/70440.shtml

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

    相关文章

    大学资产管理系统中的下载功能设计与实现

    大学资产管理系统是高校信息化建设的重要组成部分&#xff0c;它负责记录和管理学校内所有固定资产的信息。随着信息技术的发展&#xff0c;下载功能成为提高资产管理效率的关键环节之一。 系统架构的设计是实现下载功能的基础。一个良好的系统架构能够确保数据的高效传输和存储…

    Vue 3 中的 el-tooltip 详解:语法、示例及与其他框架对比

    目录 前言1. 基本知识2. 实战Demo 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. 基本知识 el-tooltip 是 Element Plus&#xff08;Vue 3 组件库&#xff09;中的一个用于提示的组件&#xff0c;它可以在…

    Android 整个屏幕可滑动,tab,viewpage是列表,tab不锁在顶

    页面整体可滑动&#xff0c;包括顶部黑色控件、Tab 和列表。 步骤 1&#xff1a;主布局文件&#xff08;activity_main.xml&#xff09; <?xml version"1.0" encoding"utf-8"?> <androidx.core.widget.NestedScrollViewxmlns:android"ht…

    Day 31 卡玛笔记

    这是基于代码随想录的每日打卡 491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0…

    快速优雅解决webview_flutter不能Safari调试的问题

    这个问题&#xff0c;网上一搜&#xff0c;又是让你去检索WKWebView&#xff0c;找到FWFWebViewHostApi.m文件&#xff0c;然后再改 iOS 的代码&#xff0c; 加一行 self.inspectable YES; 我们开发Flutter项目&#xff0c;尽量还是不要去改插件里的代码&#xff0c;好了不费…

    docker /var/lib/docker/overlay2目录把磁盘空间占满问题

    1、查看服务器磁盘空间 df -h果然100%了,docker系统文件把磁盘空间占满了。 2、进入overlay2目录&#xff0c;查找那个容器工作目录占用最高 cd /var/lib/docker/overlay2du -h --max-depth1详见下图 好家伙占用110G&#xff01;复制目录名称2c3c48ccac533c5d4a366d45a19bb9…

    Lua中文语言编程源码-第十一节,其它小改动汉化过程

    __tostring 汉化过程 liolib.c metameth[] {"__转换为字符串", f_tostring}, lauxlib.c luaL_callmeta(L, idx, "__转换为字符串") lua.c luaL_callmeta(L, 1, "__转换为字符串") __len 汉化过程 ltm.c luaT_eventname[] ltablib.c c…

    『python爬虫』获取免费IP代理 搭建自己的ip代理池(保姆级图文)

    目录 1. 环境搭建2. 获取爬虫ip3. 启动本地flask api接口服务4. 封装方法例子代码5. 自定义抓取免费ip的代理站规则6. 自定义规则示例总结欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 1. 环境搭建 这边建议python3.7-3.11版本,redis …

    回退 android studio emulator 的版本

    前情提要 最近用 frida 需要一个完全跑 arm64 的手机 os&#xff0c;因为雷电实时转义 arm 到 x64 的方案本质上还是 x64&#xff0c;会导致 frida 有 bug。查了一下有帖子说 android studio 自带的模拟器支持直接跑 arm64 的镜像 (Other Images) 直接跑跑不通&#xff0c;调…

    使用令牌桶算法通过redis实现限流

    令牌桶算法是一种常用的限流算法&#xff0c;它可以平滑地控制请求的处理速率。在 Java 中结合 Redis 实现令牌桶算法&#xff0c;可以利用 Redis 的原子操作来保证多节点环境下的限流效果。 一 实现思路 初始化令牌桶&#xff1a;在 Redis 中存储令牌桶的相关信息&#xff0…

    c语言:取绝对值

    假设我们有一个 long 类型的变量 l&#xff0c;我们希望恢复其绝对值。以下是两种方法的对比&#xff1a; 方法1&#xff1a;使用条件语句 这个很好理解&#xff0c;负数时取负运算 &#xff0c;用于数值的符号反转。 long abs_value(long l) {if (l < 0) {return -l;} e…

    02vue3实战-----项目目录详解

    02vue3实战-----项目目录详解 1.目录完整结构2.extensions.json文件3.node_modules文件夹4.public文件夹5.src文件夹6.文件.gitignore7.文件env.d.ts8.文件index.html9.文件package-lock.json和文件package.json10.文件README.md11.文件vite.config.ts12.文件tsconfig.json和文…

    【蓝桥杯嵌入式】4_key:单击+长按+双击

    全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 将4个按键的引脚设置为input&#xff0c;并将初始状态设置为Pull-up&#xff08;上拉输入&#xff09; 为解决按键抖动的问题&#xff0c;我们…

    qt部分核心机制

    作业 1> 手动将登录项目实现&#xff0c;不要使用拖拽编程 并且&#xff0c;当点击登录按钮时&#xff0c;后台会判断账号和密码是否相等&#xff0c;如果相等给出登录成功的提示&#xff0c;并且关闭当前界面&#xff0c;发射一个跳转信号&#xff0c;如果登录失败&#…

    Spring Boot启动内嵌tocmat原理

    要研究Spring Boot启动内嵌tomcat的原理&#xff0c;就需要先了解一下Spring Boot自动配置的过程&#xff0c;首先简要的梳理一下springboot自动配置的步骤。 一、SpringBoot自动配置 当SpringBoot应用启动时&#xff0c;EnableAutoConfiguration注解被激活&#xff0c;该注解…

    【论文阅读】Comment on the Security of “VOSA“

    Comment on the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的…

    idea隐藏无关文件

    idea隐藏无关文件 如果你想隐藏某些特定类型的文件&#xff08;例如 .log 文件或 .tmp 文件&#xff09;&#xff0c;可以通过以下步骤设置&#xff1a; 打开设置 在菜单栏中选择 File > Settings&#xff08;Windows/Linux&#xff09;或 IntelliJ IDEA > Preference…

    正则表达式详细介绍

    目录 正则表达式详细介绍什么是正则表达式&#xff1f;元字符转义字符字符类限定字符字符分枝字符分组懒惰匹配和贪婪匹配零宽断言 正则表达式详细介绍 什么是正则表达式&#xff1f; 正则表达式是一组由字母和符号组成的特殊文本&#xff0c;它可以用来从文本中找出满足你想…

    x64、aarch64、arm与RISC-V64:详解四种处理器架构

    x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…

    区块链技术:Facebook 重塑社交媒体信任的新篇章

    在这个信息爆炸的时代&#xff0c;社交媒体已经成为我们生活中不可或缺的一部分。然而&#xff0c;随着社交平台的快速发展&#xff0c;隐私泄露、数据滥用和虚假信息等问题也日益凸显。这些问题的核心在于传统社交媒体依赖于中心化服务器存储和管理用户数据&#xff0c;这种模…