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

七、Redis三种高级数据结构-HyperLogLog

Redis HyperLogLog是用来做基数统计的算法,HyperLogLog在优点是,在输入的元素的数量或者体积非常大时,计算基数占用的空间总是固定的、并且非常小。在Redis里每个HyperLogLog键只需花费12KB内存,就可以计算接近 264 个元素的基数。因为HyperLogLog只是计算输入元素的基数,而不会储存元素的本身,因此HyperLogLog不会返回输入的元素。

1、什么是基数

比如数据集{1,3,5,7,9,3,5,7},那么这个数据集的基数集为{1,3,5,7,9},基数为5(不重复的元素)。基数估计就是在误差可接受的范围内,快速计算基数。

2、常用命令

  • pfadd key element[element…]:将数据添加到HyperLogLog数据结构中。
  • pfcount key [key…]:返回给定HyperLogLog的基数估计值。
  • pfmerge destKey sourceKey[sourceKey]:将多个HyperLogLog合并为一个HyperLogLog

3、HyperLogLog特点

1、占用内存小,12KB的内存大小,可以统计将近264 个元素。
2、计数存在一定的误差,但整体误差率较低。标准误差为0.81%。

*在Java中,我们知道long类型占用8字节,1byte=8位,即long类型能表示的最大数值为263 -1。对应上面的 264个数。假设现在有264个数。那么按照long,以及1KB=1024字节。那么264个数占用的内存为(264 8)/1024。其占用的内存远远高于12KB。

4、HyperLogLog原理

4.1、伯努利实验

在了解为什么HyperLogLog能在占用内存那么小的情况下,来统计那么大的数据。需要先了解下伯努利实验。

伯努利试验是数学中概率论的一部分内容。它的典故来源于抛硬币。

硬币只有正反两面(正好对应计算机中的0和1),最终出现正反面的概率都是50%。假设,我们一直抛硬币,只要出现一次正面,就记为一次完整实验。中间可能一次就出现正面,也可能10次才出现正面。不论抛了多少次,只要出现一次正面,就记为一次完整的实验。这个实验就是伯努利实验。
那么对于n次伯努利实验。意味着出现了**n**次正面。每一次的结果都有可能不同。假设第一次伯努利实验抛掷次数为**k1**,以此类推,第**n**此为**kn**
其中,在n次实验中,必然会存在一次是抛掷次数最大的。假设有一次伯努利实验抛掷了12次才出现正面,是最多的一次,我们将这个数记为**k_max**
在伯努利实验中,很容易得出以下结论:
1、n次伯努利实验中的抛掷次数都不大于k_max。
2、n次伯努利实验过程中最少有一次抛掷次数等于k_max。

其中n和k_max有一个估算关联关系**n=2^k_max**(我也不知道怎么推导的)。

假如有一轮伯努利实验的例子如下:

**第一次试验: 抛了3次才出现正面,此时 k=3,n=1 **
**第二次试验: 抛了2次才出现正面,此时 k=2,n=2 **
**第三次试验: 抛了6次才出现正面,此时 k=6,n=3 **
第n 次试验:抛了12次才出现正面,此时我们估算, n = 2^12

假设在上面的例子中,我们总共实验了3组,那么最大实验次数k_max就是6,那么由公式**n=2^k_max**可得n=2^6!=3。由此可知,在实验次数很少时,这种估算结果误差很大。
image.png

4.2、估算的优化

在上面的3组例子中,我们称为一轮实验。如果只进行一轮的话,当n足够大时,误差也会变小,但不是足够小。
因此是否可以进行多轮实验,然后取每轮实验的**k_max**平均值。例如进行100轮实验,然后再取平均数k_max/100。最终在估算出n。下面是**LogLog**的估算公式:

其中,DVLL 对应的就是n;m对应实验的轮次;头上有一横的R就是平均数(k_max1+k_max2+…+k_maxm)/m;constant是修正因子,可以通过修改这个数值还改变误差率。

通过这种增加实验轮次,然后取平均数是LogLog的做法。而HyperLogLog采用的不是平均数而是调和平均数。调和平均数和算术平均数的最大的区别在于调和平均数不容易受大的值影响。

求平均工资:
A的是1000/月,B的30000/月。采用平均数的方式就是: (1000 + 30000) / 2 = 15500
采用调和平均数的方式就是: 2/(1/1000 + 1/30000) ≈ 1935.484

**调和平均数公式为,**∑ 是累加符号:

HypeLogLog结合调和平均数的计算公式为:

4.3、HyperLogLog的做法

4.3.1、bit串

在Redis的HyperLogLog中,其首先将要保存的元素通过hash函数计算得到其64位的hash值。并将这个hash值转换成bit串。例如hash值是5,那么bit串就是“101”。
那么为什么要转换成bit串呢?是为了和伯努利实验的正反面对应上。bit串中的0和1就对应了伯努利实验的正面和反面。假如一个数据的hash值的bit串是“100010000”,那么从低往高,从右往左数,第一个1的位置就是出现正面的次数。
那么基于上面的估算结论:我们就可以根据最大的抛掷次数来估算出大概进行了多少次实现。同样的,也就可以根据存入的数据,转化后出现1的位置k_max来估算出,大致存了多少数据。

4.3.2、分桶

HyperLogLog中的分桶其实就是应伯努利实现估算优化中的多轮。每一个桶对应一轮的伯努利实验。转换成计算机存储就是:存储的是一个单位是bit,长度为L的大数组S,将S分为m组,其中m就是多轮实验。每组占用的bit个数是平均记为P,那么存在以下关系:
1、L=S.length
2、L=m*P
3、以K为单位,数组S占用大小为L/8/1024

在Redis中,HyperLogLog中设置m为16834(16384个桶),P为6(每个桶占6位,只占用6位原因:bit串是64位的其中低14位用来计算桶的位置,也就是说还有50位用来得到第一个1出现的问题,如果1在最左边,那么1的位置最大也就是50,2^6 =64,是第一个大于50的数,因此6位就可以完全存下1的位置),那么L=168346(bit)。占用内存为168346/8/1024=12K。

** 第0组 第1组 … 第16833组 **
[000 000] [000 000] [000 000] [000 000] … [000 000]

4.3.3、做法

在Redis中,HyperLogLog首先,将保存的元素转换成对应的hash值bit串(64位)。然后根据bit串来计算应该落在桶的位置。按照从右往左的顺序,取14位(因为Redis只是将桶分为16384个=2^14 ,14位正好可以将桶完全使用上)。根据低14位计算到桶的位置之后,然后再根据剩下的50位,从右往左,找到第一个1的位置。如果1出现的位置index>oldIndex,那么index会替换掉oldIndex。否则是跳过。
image.png

参考文章
HyperLogLog在线观察** **

相关文章:

七、Redis三种高级数据结构-HyperLogLog

Redis HyperLogLog是用来做基数统计的算法,HyperLogLog在优点是,在输入的元素的数量或者体积非常大时,计算基数占用的空间总是固定的、并且非常小。在Redis里每个HyperLogLog键只需花费12KB内存,就可以计算接近 264 个元素的基数。…...

2024年【金属非金属矿山(露天矿山)安全管理人员】模拟考试题库及金属非金属矿山(露天矿山)安全管理人员作业模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 金属非金属矿山(露天矿山)安全管理人员模拟考试题库参考答案及金属非金属矿山(露天矿山)安全管理人员考试试题解析是安全生产模拟考试一点通题库老师及金属非金属矿山&a…...

网站DDoS攻击应对策略:全面防护与恢复指南

随着互联网的发展,网络安全问题日益凸显,其中DDoS(分布式拒绝服务)攻击成为了网站安全的主要威胁之一。当网站遭受DDoS攻击时,可能会面临服务中断、性能下降、数据泄露等严重后果。因此,了解并掌握DDoS攻击…...

线性/非线性最小二乘 与 牛顿/高斯牛顿/LM 原理及算法

最小二乘分为线性最小二乘和非线性最小二乘 最小二乘目标函数都是min ||f(x)||2 若f(x) ax b,就是线性最小二乘;若f(x) ax2 b / ax2 bx 之类的,就是非线性最小二乘; 1. 求解线性最小二乘 【参考】 2. 求解非线性最小二乘…...

mysqldump: Error 2013 导致mysql停止运行

https://www.cnblogs.com/DataArt/p/10173957.html 1 查询表大小 SELECT table_name AS "表名", round(((data_length index_length) / 1024 / 1024), 2) AS "大小(MB)" FROM information_schema.tables WHERE table_schema your_database_name AND …...

2023年数维杯国际大学生数学建模挑战赛D题洗衣房清洁计算解题全过程论文及程序

2023年数维杯国际大学生数学建模挑战赛 D题 洗衣房清洁计算 原题再现: 洗衣房清洁是人们每天都要做的事情。洗衣粉的去污作用来源于一些表面活性剂。它们可以增加水的渗透性,并利用分子间静电排斥机制去除污垢颗粒。由于表面活性剂分子的存在&#xff…...

python 两种colorbar 最大最小和分类的绘制

1 colorbar 按照自定义的最值绘制 归一化方法使用Normalize(vmin0, vmax40.0) import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.cm as cm import matplotlib.colors as mcolors from matplotlib import rcParams from matplot…...

Linux-基础IO

🌎Linux基础IO 文章目录: Linux基础IO C语言中IO交互       常用C接口         fopen         fputs         fwrite         fgets 当前路径       三个文件流 系统文件IO       open函数     …...

202006青少年软件编程(Python)等级考试试卷(二级)

第 1 题 【单选题】 以下程序的运行结果是?( ) l ["兰溪","金华","武义","永康","磐安","东阳","义乌","浦江"]for s in l:if"义"in s:print(…...

【LeetCode】每日一题:2244.完成所有任务需要的最少轮数

给你一个下标从 0 开始的整数数组 tasks ,其中 tasks[i] 表示任务的难度级别。在每一轮中,你可以完成 2 个或者 3 个 相同难度级别 的任务。 返回完成所有任务需要的 最少 轮数,如果无法完成所有任务,返回 -1 。 英文原题&#xf…...

百度文心一言 java 支持流式输出,Springboot+ sse的demo

参考&#xff1a;GitHub - mmciel/wenxin-api-java: 百度文心一言Java库&#xff0c;支持问答和对话&#xff0c;支持流式输出和同步输出。提供SpringBoot调用样例。提供拓展能力。 1、依赖 <dependency> <groupId>com.baidu.aip</groupId> <artifactId…...

59.基于SSM实现的网上花店系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;网上花店是在MySQL中建立数据表保存信息&#xff0c;运用SSMVue框架和Java语言编写。并按照软件设计开发流程进行设计实现充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SSM的网…...

什么是字节码?

字节码&#xff08;Bytecode&#xff09;是Java虚拟机&#xff08;JVM&#xff09;能够理解和执行的中间代码。Java源代码首先编译成字节码文件&#xff08;扩展名为 .class&#xff09;&#xff0c;而不是直接编译成特定机器的机器码。字节码具有以下特点&#xff1a; 平台无…...

C++ JWT的使用

接入sdk需要使用JWT加密参数&#xff0c;做个记录以备后查 #include <iostream> #include <jwt-cpp/jwt.h> int main() { // 设置JWT的密钥&#xff08;对于HS256&#xff09; std::string secret_key "your-256-bit-secret"; // 创建一个新的JW…...

SpringBoot内置插件的使用(jackson和lombok)

文章目录 引言I lombok(自动为属性生成构造器)II jacksonsee also引言 idea正式版2021.2.2 已经捆绑安装jackson和lombok插件 I lombok(自动为属性生成构造器) Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。 htt…...

Franz Electron + React 源码启动运行填坑指南

环境要求 安装miniconda python 环境electron/rebuild用得着&#xff0c;miniconda 默认自带的 python 是 3.11 版本&#xff0c;比较新&#xff1b; 安装virsual studio 2019 要把C桌面相关的都安装了&#xff0c;大概需要20G&#xff0c;不要安装到 C 盘&#xff0c;都安装到…...

网络安全法中关于网络信息的保护和监管,有哪些规定?

网络安全法作为我们数字时代的重要法律保障&#xff0c;对于网络信息的保护和监管有着明确且详细的规定。这些规定不仅体现了国家对于网络安全的重视&#xff0c;也为我们每个人在数字世界中提供了坚实的法律屏障。 首先&#xff0c;我们来看一个关于网络运营者主体责任的案例。…...

前端XHR请求数据

axios封装了XHR(XMLHttpRequest) 效果 项目结构 Jakarta EE9&#xff0c;Web项目。 无额外的maven依赖 1、Web页面 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title&…...

利用香港多IP服务器优化网站访问速度的关键策略?

利用香港多IP服务器优化网站访问速度的关键策略? 随着数字化时代的不断发展&#xff0c;网站的全球访问速度成为企业吸引用户、提升竞争力的重要因素。特别对于跨国企业而言&#xff0c;如何确保全球用户都能享受到稳定快速的访问体验显得尤为重要。在这一背景下&#xff0c;…...

如何快速将视频做成二维码?扫描二维码播放视频的制作方法

视频二维码的用途越来越多&#xff0c;比如常见的有产品展示、企业宣传、教程说明、个人展示等都可以生成二维码&#xff0c;通过扫码在手机或者其他设备上预览内容&#xff0c;从而提升其他人获取视频的速度&#xff0c;实现内容的快速分享。 对于有制作视频二维码需求的小伙…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...