如何用 Redis 统计海量 UV?

引言:在当今数字化时代,对于网站和应用程序的运营者而言,了解其用户的行为和习惯是至关重要的。其中,衡量页面的独立访客数量(UV)是评估网站流量和用户参与度的重要指标之一。然而,当面对海量访问数据时,传统的计数方法可能变得低效且成本高昂。为解决这一挑战,Redis 提供了一种高效的解决方案:HyperLogLog。HyperLogLog 是一种基数估算算法,能够在常量时间内对集合中不同元素的近似数量进行快速估算。本文就来详细介绍下如何使用 Redis 统计海量 UV。

PV、UV 是什么?

PV(Page Views)是页面浏览量,指的是网站或应用程序页面被访问的次数。每一次页面的加载都被视为一个页面浏览量,无论是否为同一用户。

UV(Unique Visitors)是独立访客数量,指的是访问网站或应用程序的唯一用户数量。UV通常用于衡量网站或应用程序的独立用户群体规模,而不考虑他们的访问频率。PV 和 UV 是衡量网站或应用程序流量和用户参与度的重要指标之一。

Redis 的 HyperLogLog

请添加图片描述
在 Redis 中,有一种可以用于网页 UV 、PV等值统计的数据结构,这个数据结构就是 HyperLogLog。

HyperLogLog 是一种基数估算算法,可以用于快速计算一个集合中的不同元素数量的近似值。

在使用 HyperLogLog 统计页面 UV 时,我们可以将每个访问者的 IP 地址作为一个元素加入到 HyperLogLog 中,然后通过计算 HyperLogLog 中元素数量的近似值来估计页面的唯一访问者数量。

以下是一个示例代码,展示如何使用 Redis 的 HyperLogLog 实现页面 UV 统计:

import redis.clients.jedis.Jedis;public class HyperLogLogExample {public static void main(String[] args) {// 连接 Redis 服务器Jedis jedis = new Jedis("localhost");// 创建一个 HyperLogLog 实例String hyperLogLogKey = "unique_users";// 模拟用户访问行为,向 HyperLogLog 中添加元素jedis.pfadd(hyperLogLogKey, "user1", "user2", "user3", "user4");// 获取 HyperLogLog 的基数估计结果long estimatedCount = jedis.pfcount(hyperLogLogKey);System.out.println("Estimated unique users: " + estimatedCount);// 模拟新的用户访问jedis.pfadd(hyperLogLogKey, "user5", "user6", "user7");// 更新基数估计结果estimatedCount = jedis.pfcount(hyperLogLogKey);System.out.println("Updated estimated unique users: " + estimatedCount);// 关闭 Redis 连接jedis.close();}
}

在上面的示例代码中,我们使用 Redis 的 pfadd() 方法将每个访问者的 IP 地址加入到名为 page_views 的 HyperLogLog 中。然后,我们使用 pfcount() 方法获取 page_views 中元素数量的近似值,并将其作为页面 UV 的估计值输出到控制台。

工作原理详解

1)HyperLogLog 使用哈希函数将元素映射到位数组中的位置。这个哈希函数具有以下特性

1.1)映射结果均匀分布,确保元素被均匀地分散在位数组中。

1.2)映射结果的位数远远超过位数组的大小,以减少哈希冲突的可能性。

2)位数组存储

当一个元素被哈希映射到位数组中时,位数组的对应位置被设置为 1。但是,HyperLogLog 不仅仅是简单地存储元素是否存在,而是根据哈希函数的结果,找到最高位为 0 的位置,将其后的连续 0 的个数记录下来。这个数值被称为前缀零的数量(Prefix Zeros)。在位数组中,前缀零的数量表示了元素的分布情况,它越大,表示元素的分布越稀疏,因此估计的基数(集合中不同元素的数量)也就越大。

3)估计基数

通过统计位数组中前缀零的数量,并结合适当的校正和插值算法,HyperLogLog 可以估计出集合中不同元素的数量。这个估计值通常是一个近似值,但在大多数情况下是相当准确的。

HyperLogLog 其他应用

1)分布式系统中的基数合并:

在分布式系统中,当多个节点收集数据后需要合并统计结果时,HyperLogLog 可以用于快速、高效地合并基数估计结果。通过将每个节点的 HyperLogLog 结果进行合并,系统可以快速得出整体的基数估计结果,而无需传输大量的原始数据。

2)数据库查询优化:

在数据库系统中,HyperLogLog 可以用于优化查询执行计划,例如对于 DISTINCT 查询或 GROUP BY 查询,可以使用 HyperLogLog 进行基数估计来避免耗时的全表扫描操作,从而提高查询性能。

3)物联网设备管理:

在物联网领域,HyperLogLog 可以用于估计不同设备的数量,帮助企业管理和监控物联网设备的分布和使用情况,从而进行资源调配和性能优化。

HyperLogLog 的优点:

内存效率高:HyperLogLog 使用固定大小的数据结构来估计大数据集的基数,因此在存储方面非常高效。相比之下,传统的统计方法可能需要存储每个计数的详细信息,占用更多的内存空间。

计算效率高:HyperLogLog 在计算基数估计时具有常量时间复杂度,与集合大小无关。这意味着无论数据规模多大,计算基数估计的时间都是固定的。相比之下,传统的统计方法可能需要对整个数据集进行遍历或聚合,时间复杂度可能与数据规模成线性关系。

分布式计算支持:HyperLogLog 可以很容易地在分布式环境下进行计算,各个节点可以独立地计算本地数据的基数估计结果,然后将结果合并。这使得它非常适合处理大规模分布式系统中的基数估计问题。

近似精度可控:HyperLogLog 允许用户在存储和计算效率之间进行权衡,通过调整哈希函数数量或位数,可以控制基数估计结果的近似精度。这使得它可以灵活地应对不同精度要求的场景。

HyperLogLog 的缺点:

近似精度:HyperLogLog 提供的基数估计结果是近似值,而不是精确值。虽然在大多数情况下,它的近似精度可以满足需求,但在一些特定情况下可能无法提供足够精确的结果。

不适用于小数据集:HyperLogLog 在处理小数据集时可能会产生较大的误差,因为在数据量较小时,哈希冲突的概率会增加,从而影响基数估计的准确性。

传统统计方法的缺点:

内存和计算成本高:传统的统计方法可能需要大量的内存来存储详细的计数信息,也可能需要耗费大量的计算资源来对数据集进行聚合或遍历,特别是在大数据集的情况下。

不适用于分布式环境:一些传统的统计方法可能不太适用于分布式环境下的计算,需要额外的复杂性来进行并行化或分布式处理。

综上所述,HyperLogLog 在处理大数据集的基数估计问题时具有显著的优势,尤其在内存和计算效率方面,但在精确性和适用性方面可能存在一些限制。在实际应用中,需要根据具体场景的需求来选择合适的统计方法。

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

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

相关文章

基于物联网表计的综合能源管理方案

安科瑞电气股份有限公司 祁洁 acrelqj 摘要:为加快推进国家“双碳”战略和新型能源体系建设,努力实现负荷精准控制和用户精细化管理,按照“政府主导、电网组织、政企协同、用户实施”的指导原则,多地成立市/县级电力负荷管理中…

VMware Workstation 虚拟机安装 ubuntu 24.04 server 详细教程 服务器安装图形化界面

1 阿里云下载 ubuntu-releases安装包下载_开源镜像站-阿里云 2 打开vmware,新建虚拟机 3 选择下载的镜像,开始安装 3 光驱这里修改下 4 重新启动,安装图形化界面 #更新软件包列表 sudo apt-get update #安装Ubuntu图形桌面 sudo apt install ubuntu-desktop 5 安…

弱密码系统登录之后强制修改密码

在你登录的时候,获取到弱密码,然后将他存到vuex里面,在登录进去之后,index页面再去取,思路是这样的 一、vuex里面定义密码字段 我是直接在user.js里面写的 import { login, logout, getInfo } from /api/login impo…

动手学深度学习22 池化层

动手学深度学习22 池化层 1. 池化层2. 实现3. QA 课本: https://zh-v2.d2l.ai/chapter_convolutional-neural-networks/pooling.html 视频: https://www.bilibili.com/video/BV1EV411j7nX/?spm_id_fromautoNext&vd_sourceeb04c9a33e87ceba9c9a2e5f0…

清理mysql binglog文件

mysql随着使用时间的推移,binglog文件会越来越大,比如我们的oa系统,上线4年多了,最近总有磁盘空间满影响系统正常使用的情况出现。检查后发现binglog是罪归祸首。 binglog文件最好不要采用应删除的方式清理,如下方式可…

X-CSV-Reader:一个使用Rust实现CSV命令行读取器

&#x1f388;效果演示 ⚡️快速上手 依赖导入&#xff1a; cargo add csv读取实现&#xff1a; use std::error::Error; use std::fs::File; use std::path::Path;fn read_csv<P: AsRef<Path>>(filename: P) -> Result<(), Box<dyn Error>> {le…

【机器学习】——线性模型

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

Blender人物插件Human Generator Ultimate下载及打开方式

一、Blender介绍及安装 Blender是一款免费开源三维图形图像软件&#xff0c;提供从建模、动画、材质、渲染、到音频处理、视频剪辑等一系列动画短片制作解决方案。 安装方式非常简单&#xff0c;官网下载即可&#xff0c;截止到2024年5月&#xff0c;Blender以更新至4.1版本了…

Bonfire - [Asset for Zibra Smoke Fire]

Bonfire资产支持URP、BRP和HDRP渲染管道,可以用作VFX或游戏元素。 这种环境资产可用于增强视觉故事性,以及创建自定义游戏机制,为虚拟世界增加互动性和真实性。 全交互:使用Zibra Smoke&Fire进行实时烟雾模拟。 易于使用:您所需要做的就是购买资产并将其放入场景中。不…

深入分析 Android Activity (六)

文章目录 深入分析 Android Activity (六)1. Activity 的权限管理1.1 在 Manifest 文件中声明权限1.2 运行时请求权限1.3 处理权限请求结果1.4 处理权限的最佳实践 2. Activity 的数据传递2.1 使用 Intent 传递数据2.2 使用 Bundle 传递复杂数据 3. Activity 的动画和过渡效果3…

技术面‍:前端代码是如何与服务器交互的

前言&#xff1a; 本篇文章主要是想讲解 .html 文件和 .CSS 文件在实际开发中和后端服务器交互最后上线的基础原理。 面向的人群&#x1f195;&#xff1a;是刚入行不久&#xff0c;且目前只会写前端业务代码而不清楚整个工作流的前端新人。我会从 0 开始一步一步带你理解整个…

当HR问你是否单身时,该怎么回答?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测技术社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;我是晶圆厂厂务工程师&#xff0c;最近在面试新工作&#xff0c;但是几乎每家HR都会问我同一个问题&#xff1a;你结婚没有&#xff1…

短剧平台开发中的常见误区及避坑指南,别再走弯路

1. 误区一&#xff1a;只注重外观&#xff0c;忽视技术基础 在短剧平台开发中&#xff0c;一个常见的误区是过于注重产品的外观设计&#xff0c;而忽视了技术基础的重要性。团队往往会投入大量精力和资源来打造吸引人的UI和炫酷的特效&#xff0c;但忽略了系统架构、性能优化和…

听说京东618裁员?所以日常准备很重要呀

文末有最少必要的面试题&#xff0c;还准备了离线 PDF 版本。 京东也要向市场输送人才了? 这几天看到技术群里不少朋友在讨论京东裁员相关的信息。 我去看了下京东近期的操作&#xff0c;京东内部考勤调整和午休时间缩短&#xff0c;以及强化打卡机制等管理调整&#xff1b;有…

腾讯Java社招面试题真题,最新面试题

Java中synchronized和ReentrantLock有什么区别&#xff1f; 1、锁的实现方式不同&#xff1a; synchronized是JVM层面的锁&#xff0c;主要依赖于监视器对象&#xff08;monitor&#xff09;实现。ReentrantLock是JDK层面的锁&#xff0c;通过Java代码实现&#xff0c;提供了更…

echarts- 热力图, k线图,雷达图

热力图 热力图可以看成是一种矩形的散点图。 热力图的矩形受itemStyle的影响。 通常配合visualmap组件来根据值的大小做颜色的变化。 热力图主要通过颜色去表现数值的大小&#xff0c;必须要配合 visualMap 组件使用。 visualMap:视觉映射组件 let options {tooltip: {},xAx…

Kali的基本扫描命令

nmap -sP 192.168.10.0/24 //扫描10网段存活的主机 nmap -P 192.168.10.142 //扫描主机开放的端口 nmap -sS 192.168.10.142 //TCP半开扫描 nmap -sT 192.168.10.142 //TCP全开扫描 nmap -O 192.168.10.142 //扫描靶机的操作系统类型 nmap -sV 192.168.10.142 //扫描开放端口对…

使用Prometheus组件node_exporter采集linux系统的指标数据(包括cpu/内存/磁盘/网络)

一、背景 Linux系统的基本指标包括cpu、内存、磁盘、网络等&#xff0c;其中网络可以细分为带宽进出口流量、连接数和tcp监控等。 本文使用Prometheus组件node_exporter采集&#xff0c;存储在promethues&#xff0c;展示在grafana面板。 二、安装node_exporter 1、下载至本…

Bean 的生命周期的各个阶段

Bean的生命周期通常可以归结为以下几个阶段&#xff1a; 1.实例化&#xff08;Instantiation&#xff09;&#xff1a; Spring根据Bean的定义&#xff08;如XML配置、Java配置或注解&#xff09;来实例化Bean&#xff0c;这个阶段会分配内存空间给Bean&#xff0c;生成一个原始…

微服务:Ribbon负载均衡与加载时机修改

Ribbon 负载均衡 执行流程 负载均衡策略 调整负载均衡方案&#xff1a; 配置类中&#xff08;全局&#xff09;&#xff1a; // 负载均衡策略Beanpublic IRule randomRule() {return new RandomRule();}yaml配置 userservice: # 给某个微服务配置负载均衡规则&#xff…