七、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。由此可知,在实验次数很少时,这种估算结果误差很大。
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。否则是跳过。
参考文章
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题 洗衣房清洁计算 原题再现: 洗衣房清洁是人们每天都要做的事情。洗衣粉的去污作用来源于一些表面活性剂。它们可以增加水的渗透性,并利用分子间静电排斥机制去除污垢颗粒。由于表面活性剂分子的存在ÿ…...

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 。 英文原题…...

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

59.基于SSM实现的网上花店系统(项目 + 论文)
项目介绍 本站是一个B/S模式系统,网上花店是在MySQL中建立数据表保存信息,运用SSMVue框架和Java语言编写。并按照软件设计开发流程进行设计实现充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SSM的网…...
什么是字节码?
字节码(Bytecode)是Java虚拟机(JVM)能够理解和执行的中间代码。Java源代码首先编译成字节码文件(扩展名为 .class),而不是直接编译成特定机器的机器码。字节码具有以下特点: 平台无…...
C++ JWT的使用
接入sdk需要使用JWT加密参数,做个记录以备后查 #include <iostream> #include <jwt-cpp/jwt.h> int main() { // 设置JWT的密钥(对于HS256) 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用得着,miniconda 默认自带的 python 是 3.11 版本,比较新; 安装virsual studio 2019 要把C桌面相关的都安装了,大概需要20G,不要安装到 C 盘,都安装到…...

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

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

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

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

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...