Redis HyperLogLog 数据结构模型统计

HyperLogLog

HyperLogLog 不是一种新的数据结构 , 本质上是字符串类型。 是一种基数算法。 通过 HyperLogLog 可以节省内存空间,并完成独立总数的统计。

HyperLogLog 数据结构可用于仅使用少量恒定内存来计算集合中的唯一元素,具体而言,每个 HyperLogLog 为 12k 字节(加上键本身的几个字节)。

HyperLogLog 相关命令:

  • PFADD: 将所有元素参数添加到存储在作为第一个参数指定的变量名中的HyperLogLog数据结构中。
  • PFCOUNT: 使用单个键调用时,返回存储在指定变量处的HyperLogLog数据结构计算的近似基数,如果该变量不存在,则返回0。
  • PFDEBUG:是一个内部命令。它是用来开发和测试Redis的。
  • PFMERGE: 将多个HyperLogLog值合并为一个唯一的值,该值将近似于源HyperLogLog结构的观察集的并集的基数。
  • PFSELFTEST: 是一个内部命令。它是用来开发和测试Redis的。

PFADD

添加元素,复杂度 O(1), 用于向 HyperLogLog 添加 元素 , 如果成功返回 1 :

PFADD key [element [element ...]]

向 键 2023_12-11:user 添加 元素

192.168.88.11:6380> PFADD 2023_12-11:user "user1" "user2" "user3" "user4" "user5" "user6"
(integer) 1192.168.88.11:6380> PFADD 2023_12-12:user "user1" "user3" "user5" "user7" "user8" "user9"
(integer) 1

HyperLogLog 不是一种新的数据结构 , 本质上是字符串类型。 HyperLogLog 是一个 Redis 字符串,可以使用 GET 检索 和 SET 恢复。

192.168.88.11:6380> type 2023_12-11:user
string192.168.88.11:6380> get 2023_12-11:user
"HYLL\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80WR\x80F\x19\x80E\xed\x8cF\x10\x84N\x92\x80@\xfc\x80F\xfd"192.168.88.11:6380> type 2023_12-12:user
string192.168.88.11:6380> get 2023_12-12:user
"HYLL\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80WR\x80F\x19\x80[\x91\x80B\xb9\x8cA\x7f\x84Ab\x88A]"

PFCOUNT

用于计算一个或多个HyperLogLog的独立总数, 当使用单个键调用时,复杂度 O(1),平均时间非常小。当调用多个键时,复杂度O(N),其中N是键的个数,时间要大得多。

如: 计算 2023_12-11:user 、 2023_12-12:user 的独立总数

192.168.88.11:6380> PFCOUNT 2023_12-11:user
(integer) 6192.168.88.11:6380> PFCOUNT 2023_12-12:user
(integer) 6

往 2023_12-11:user 、 2023_12-12:user 插入新的元素:

192.168.88.11:6380> PFADD 2023_12-11:user "user10" "user11"
(integer) 1192.168.88.11:6380> PFADD 2023_12-12:user "user15" "user16" "user20" "user21"
(integer) 1

再次 计算 2023_12-11:user 、 2023_12-12:user 的独立总数

192.168.88.11:6380> PFCOUNT 2023_12-11:user
(integer) 8192.168.88.11:6380> PFCOUNT 2023_12-12:user
(integer) 10

计算 两个键 2023_12-11:user 、 2023_12-12:user 的独立总数 (3个重复用户: user1、user3、user5)
在这里插入图片描述

当使用多个键调用时,通过在内部将存储在提供键处的HyperLogLog合并为临时HyperLogLog,返回传递的HyperLogLog联合的近似基数。

返回的观察集基数并不精确,而是近似值,标准误差为 0.81%。

当PFCOUNT使用多个键调用时,会执行 HyperLogLogs 的即时合并,这很慢,而且联合的基数无法缓存,因此当使用多个键时PFCOUNT可能需要大约时间毫秒级,不应滥用。

192.168.88.11:6380> PFCOUNT 2023_12-11:user 2023_12-12:user 
(integer) 15

PFMERGE

pfmerge 可以合并多个 HyperLogLog的并集赋值给 destkey

将多个 HyperLogLog 值合并为一个唯一值,该值将近似观察到的源 HyperLogLog 结构集的并集基数。

计算出的合并 HyperLogLog 设置为目标变量,如果不存在则创建该变量(默认为空 HyperLogLog)。

如合并 两个键 2023_12-11:user 、 2023_12-12:user 的独立总数:

192.168.88.11:6380> PFMERGE 2023_12-11-12:user  2023_12-11:user 2023_12-12:user
OK192.168.88.11:6380> PFCOUNT 2023_12-11-12:user
(integer) 15

Memory

分别向 HyperLogLog、 Set 插入10万个 用户,并对比内存使用量,如下:

  • 插入 10 万用户到 HyperLogLog:2023_12:users
192.168.88.11:6380> eval "for i=1,100000\ndo\n  redis.call('pfadd', 'HyperLogLog:2023_12:users', 'user'..i)\nend\n" 0 
(nil)
(0.63s)# 返回的观察集基数并不精确,而是近似值,  即 : 99725/100000=99.7%, 误差: 0.27% 
192.168.88.11:6380> PFCOUNT HyperLogLog:2023_12:users
(integer) 99725# 内存使用量 12KB
192.168.88.11:6380> MEMORY USAGE HyperLogLog:2023_12:users
(integer) 12377
  • 同样插入 10 万用户到 Set:2023_12:users
192.168.88.11:6380> eval "for i=1,100000\ndo\n  redis.call('sadd', 'Set:2023_12:users', 'user'..i)\nend\n" 0 
(nil)
(0.74s)# 数量精确
192.168.88.11:6380> SCARD Set:2023_12:users
(integer) 100000# 内存使用量 4.8MB 
192.168.88.11:6380> MEMORY USAGE Set:2023_12:users
(integer) 5033019

小结

  • HyperLogLog 数据结构可用于仅使用少量恒定内存来计算集合中的唯一元素, 内存占用非常小。 但是存在错误率。
  • 可以容忍一定的错误率,返回的观察集基数并不精确,而是近似值,标准误差为 0.81%。
  • 只是想统计独立总数、而不需要获取具体的单条数据。

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

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

相关文章

el-table的复选框占满全格

el-table的复选框格子很小每次点击都点不到&#xff0c;又不想设置行点击&#xff0c;因为每次复制内容都会选中&#xff0c;实现效果是点击el-table的复选框单元格就可以选中 <template><div style"width: 60vw; margin: 10px;"><el-table :data&quo…

OpenAI承认GPT-4变懒,即将发布修复方案提升性能

目录 1OpenAI承认GPT-4变懒&#xff0c;即将发布修复方案提升性能 2一文秒懂人工智能全球近况 1OpenAI承认GPT-4变懒&#xff0c;即将发布修复方案提升性能 **划重点:** 1. &#x1f92f; 用户反馈:GPT-4使用者抱怨OpenAI破坏了体验&#xff0c;称模型几乎“害怕”提供答案。…

没有明确的报错信息,阿里云国际版Windows服务器无法远程连接

在远程连接失败时&#xff0c;如果您没有收到系统返回的报错信息&#xff0c;并且ECS实例是运行中的状态&#xff0c;然后再根据以下步骤进行排查&#xff1a; 步骤一&#xff1a;使用阿里云Workbench工具测试远程登录 步骤二&#xff1a;检查是否有收到黑洞通知 步骤三&…

vue2-elementUI部分组件样式修改

el-radio样式&#xff1a; /deep/ .el-radio__input .el-radio__inner {width: 20px;height: 20px;position: relative;cursor: pointer;-webkit-appearance: none;-moz-appearance: none;appearance: none;border: 1px solid #999;border-radius: 0;outline: none;transition…

记录 | xftp远程连接两台windows

1、打开openssh 设置 -> 应用 -> 可选功能 -> 添加功能 -> OpenSSH 客户端&#xff0c;将 ssh 客户端安装将两台电脑的 ssh 开启&#xff0c;cmd 中输入 net start sshd2、配置 win10 账号密码 3、进行 xftp 连接

Flink之迟到的数据

迟到数据的处理 推迟水位线推进: WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(2))设置窗口延迟关闭&#xff1a;.allowedLateness(Time.seconds(3))使用侧流接收迟到的数据: .sideOutputLateData(lateData) public class Flink12_LateDataC…

两线制 4-20mA 隔离变送器(输出回路供电)

两线制 4-20mA 隔离变送器(输出回路供电) 特征&#xff1a; ◆低成本&#xff0c;小体积&#xff0c;符合 UL94-V0 阻燃标准 ◆安装方式采用国际标准 DIN35mm 导轨安装方式 ◆双隔离(信号输入、信号输出相互之间 3000VDC 隔离) ◆4-20mA 电流输入与输出&#xff0c;精度高(失真…

Vue3封装一个轮播图组件

先看效果 编写组件代码 CarouselChart.vue <template><div classimg-box><el-button clickpreviousImages v-ifprops.showBtn>←</el-button><div classimg><div styledisplay: flex;gap: 20px idmove><imgclassimg-item v-for(item…

TrustZone之安全虚拟化

在Armv7-A首次引入虚拟化时,它仅在非安全状态中添加。在Armv8.3之前,Armv8也是如此,如下图所示: 如前所述在切换安全状态时,EL3用于托管固件和安全监视器。安全EL0/1托管受信任的执行环境(TEE),由受信任的服务和内核组成。 在安全状态下,没有对多个虚拟机的需…

云计算 云原生

一、引言 云计算需要终端把信息上传到服务器&#xff0c;服务器处理后再返回给终端。在之前人手一台手机的情况下&#xff0c;云计算还是能handle得过来的。但是随着物联网的发展&#xff0c;什么东西都要联网&#xff0c;那数据可就多了去了&#xff0c;服务器处理不过来&…

【docker】常用命令

启动docker服务 systemctl start docker 停止docker服务 systemctl stop docker 重启docker服务 systemctl restart docker 查看docker服务状态 systemctl status docker 设置开机启动docker服务 systemctl enable docker 设置关闭开机启动docker服务 systemctl disable …

设计模式——建造者模式(创建型)

引言 生成器模式是一种创建型设计模式&#xff0c; 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 问题 假设有这样一个复杂对象&#xff0c; 在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。 这些初始化代码…