Redis中HyperLogLog的使用

目录

前言

HyperLogLog


前言

在学习HyperLogLog之前,我们需要先学习两个概念

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

如果UV在服务端做会很麻烦,因为每次都需要判断该用户是否已经统计过了,因此需要保存统计过的用户信息,如果都保存在Redis中,大型网站的数据量会非常大这种实现方案并不现实。因此,我们需要使用HyperLogLog算法。

HyperLogLog

该算法又可以叫做HLL算法,是从LogLog算法派生的概率算法,用于确定非常大的集合的基数,而不需要存储其所有值,Redis中的HLL是基于String结构实现的,单个HLL的内存占用永远不会超过16k,相应的代价是测量结果是概率性的,存在一定误差,但是可以忽略不计。

对应的命令如下

# 添加用户ip
PFADD key element [element ...]
# 统计访问量,在存在多个key的情况下,会对多个key的访问用户进行去重后再统计
PFCOUNT key [key ...]
# 合并统计量
PFMERGE destkey sourcekey [sourcekey ...]

接下来我们对该方法进行测试,首先我们对 hll1 这个key进行插入,插入结果如下

那么接下来插入key为 hll2 的数据,执行结果结果如下

在 key 为 hll2 的数据完全包含了key为 hll1 的值时,我们对两个 key 进行联合统计,观察输出结果

可以看到,我们的统计结果是进行了去重后再进行统计的。那么接下来测试合并方法

hll2 的数据会合并到 hll1 中,该方法的存在,我们可以设置ip访问时设置 key 为年月日,这样我们可以通过合并每天的key来统计每月的活跃人数。接下来我们测试HLL的内存占用情况

首先是我们先获取没有存储100w数据情况时的内存使用情况,需要注意的时,该值为字节值,需要我们自己转化为kb

测试代码如下,我们需要创建100w的对象来模拟访问量通过HLL存储,我们测试Redis的占用情况

@Test
public void test01() throws Exception {
    String[] str = new String[1000];
    int j =0;
    for (int i = 0; i < 1000000; i++) {
        j = i%1000;
        str[j] = "user"+i;
        if (j == 999){
            stringRedisTemplate.opsForHyperLogLog().add("hll1",str);
        }
    }
    Long count = stringRedisTemplate.opsForHyperLogLog().size("hll1");
    System.out.println(count);
}

执行完测试代码后的内存占用情况以及统计结果如下,内存占用变为 900992,统计次数为 1001788,可以看到存在一定误差,但是对于100w数据来说基本可以忽略不计。

计算添加完数据后的内存占用(900992-886608)/1024 ≈ 14k。并且无论执行多少次添加数据操作,只要对象不发生改变,永远统计到的数量为1001788。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ribbon组件的负载均衡原理

原因背景 spring cloud的底层负载均衡是采用Ribbon组件&#xff0c;我们将user-service服务注册到eureka-server中&#xff0c;那么当我们在另一个服务的代码层面请求远程调用API接口http://user-service/users/5时&#xff0c;程序代码如何解析远程调用的user-service服务名转…

PyTorch机器学习与深度学习实践技术应用

近年来&#xff0c;随着AlphaGo、无人驾驶汽车、医学影像智慧辅助诊疗、ImageNet竞赛等热点事件的发生&#xff0c;人工智能迎来了新一轮的发展浪潮。尤其是深度学习技术&#xff0c;在许多行业都取得了颠覆性的成果。另外&#xff0c;近年来&#xff0c;Pytorch深度学习框架受…

在re:Invent大会上,上汽海外出行选择亚马逊云科技为其提供智能网联解决方案

亚马逊云科技在re:Invent 2023上宣布&#xff0c;中国最大的汽车制造商之一、《财富》世界500强企业上汽集团旗下的上汽海外出行科技有限公司&#xff08;以下简称“上汽海外出行”&#xff09;已选择亚马逊云科技为重要云服务供应商&#xff0c;为出海的自主品牌汽车构建领先的…

NFC和蓝牙在物联网中有什么意义?如何选择?

#NFC物联网# #蓝牙物联网# 在物联网中&#xff0c;NFC和蓝牙有什么意义&#xff1f; NFC在物联网中代表近场通信技术。它是一种短距离、高频的无线通信技术&#xff0c;可以在近距离内实现设备间的数据传输和识别。NFC技术主要用于移动支付、电子票务、门禁、移动身份识别、防…

期末速成数据库极简版【查询】(3)

目录 多表查询 【8】多表连接——内连接 &#x1f642;等值连接 &#x1f642;自然连接 &#x1f642;非等值连接 【9】多表连接——外连接 【10】交叉连接不考 【11】联合查询 【12】扩展多表连接 【13】嵌套查询 &#x1f642; 多表查询 【8】多表连接——内连…

QT+Unity3D 超详细(将unity3D与QT进行连接,并实现信息传递)

QTUnity3D连接 在QT中连接unity3D&#xff0c;首先要有一个unity.exe执行文件。在这里不提供unity执行文件的编写&#xff0c;只提供QT这边与unity3D连接和信息传递。 创建项目 创建一个新的项目&#xff0c;我创建的项目名称如下。 下图是我建立新项目的文件。APP文件就是…

Python查看文件列表

os.listdir 是 Python 的一个内置函数&#xff0c;用于列出指定目录中的所有文件和子目录。它接受一个字符串参数&#xff0c;即要列出内容的目录的路径。 列出当前工作目录中的所有文件和子目录 files_and_dirs os.listdir() print(files_and_dirs) 列出指定目录中的所…

User: zhangflink is not allowed to impersonate zhangflink

使用hive2连接进行添加数据是报错&#xff1a; [08S01][1] Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. User: zhangflink is not allowed to impersonate zhangflink 有些文章说需要修…

解决:spring boot+mybatis进行增删改查的时候,接收到前端数据,并且执行成功了,但是数据库里面添加的内容都是空值

在写spring boot整合mybatis的时候&#xff0c;我在Apifox里面测试&#xff0c;数据也传递过去了&#xff0c;后端服务器也接收到了参数&#xff0c;就是数据库里面添加的都是空值&#xff1f;&#xff1f;&#xff1f; 前端接收到了数据&#xff0c;并且没有报错 Apifox里面也…

Kubernetes入门笔记——(2)k8s设计文档

​k8s最初源自谷歌的Brog项目&#xff0c;架构与其类似&#xff0c;主要包括etcd、api server、controller manager、scheduler、kubelet和kube-proxy等组件 etcd&#xff1a;分布式存储&#xff0c;保存k8s集群的状态 api server&#xff1a;资源操作的唯一入口&#xff0c;…

使用GPT-4V解决Pycharm设置问题

pycharm如何实现关联&#xff0c;用中文回答 在PyCharm中关联PDF文件类型&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 打开PyCharm设置&#xff1a;点击菜单栏中的“File”&#xff08;文件&#xff09;&#xff0c;然后选择“Settings”&#xff08;设置&#xff09;。…

STM32——震动传感器点亮LED灯

震动传感器简单介绍 若产品不震动&#xff0c;模块上的 DO 口输出高电平&#xff1b; 若产品震动&#xff0c;模块上的 DO 口输出低电平&#xff0c;D0-LED绿色指示灯亮。 震动传感器与STM32的接线 编程实现 需求&#xff1a;当震动传感器接收到震动信号时&#xff0c;使用中断…

同旺科技 USB TO RS-485 定制款适配器--- 拆解(四)

内附链接 1、USB TO RS-485 定制款适配器 ● 支持USB 2.0/3.0接口&#xff0c;并兼容USB 1.1接口&#xff1b; ● 支持USB总线供电&#xff1b; ● 支持Windows系统驱动&#xff0c;包含WIN10 / WIN11系统32 / 64位&#xff1b; ● 支持Windows RT、Linux、Mac OS X、Windo…

Windows Installer服务启动不了问题解决办法

本章教程主要提供在win10和win11 系统服务Windows Installer&#xff0c;处于灰色状态&#xff0c;无法启动的时候的一种解决方法。 目录 解决办法 1、进入注册表 2、找到以下路径 解决办法 1、进入注册表 regedit 2、找到以下路径 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet00…

bert其他内容个人记录

Pre-training a seq2seq model BERT只是一个预训练Encoder&#xff0c;有没有办法预训练Seq2Seq模型的Decoder&#xff1f; 在一个transformer的模型中&#xff0c;将输入的序列损坏&#xff0c;然后Decoder输出句子被破坏前的结果&#xff0c;训练这个模型实际上是预训练一个…

OpenHarmony北向-让更广泛的应用开发者更容易参与

一、标准系统的体验 按照官方文档指导&#xff0c;这样操作&#xff0c;OH标准系统开发板就可以运行开发者开发的OpenHarmony应用了。 二、实际情况 按照开发文档上的说明&#xff0c;肯定是装不上的。因为OH不同的发行版&#xff0c;不同发行板不同的设备&#xff0c;IDE&…

使用Java8的Stream流的Collectors.toMap来生成Map结构

问题描述 在日常开发中总会有这样的代码&#xff0c;将一个List转为Map集合&#xff0c;使用其中的某个属性为key&#xff0c;某个属性为value。 常规实现 public class CollectorsToMapDemo {DataNoArgsConstructorAllArgsConstructorpublic static class Student {private…

java设计模式学习之【装饰器模式】

文章目录 引言装饰器模式简介定义与用途实现方式 使用场景优势与劣势装饰器模式在Spring中的应用画图示例代码地址 引言 在日常生活中&#xff0c;我们常常对基本事物添加额外的装饰以增强其功能或美观。例如&#xff0c;给手机加一个保护壳来提升其防护能力&#xff0c;或者在…

fastapi.templating与HTMLResponse

要声明一个模板对象&#xff0c;应将存储html模板的文件夹作为参数提供。在当前工作目录中&#xff0c;我们将创建一个 “templates “目录。 templates Jinja2Templates(directory“templates”) 我们现在要把这个页面的HTML代码渲染成HTMLResponse。让我们修改一下hello()函…

软考高项第四版五组十域表+ITTO背诵笔记及助记

基于第四版做的笔记&#xff0c;助记是自己编的 还是得靠理解记忆&#xff0c;下面是文档&#xff0c;也用anki制作了记忆卡片&#xff0c;需要的可以自行导入卡包