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.rhkb.cn/news/215308.html

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

相关文章

Linux高级管理-基于域名的虚拟Web主机搭建

客服机限制地址 通过 Require 配置项&#xff0c;可以根据主机的主机名或P地址来决定是否允许客户端访问。在httpd服 务器的主配置文件的<Location>&#xff0c;<Directory>、<Files>、<Limit>配置段中均可以使用Require 配置 项来控制客户端的访问。使…

Linux——web网站服务(一)

一、安装httpd服务器Apache网站服务 1、准备工作 为了避免发送端口冲突&#xff0c;程序冲突等现象&#xff0c;卸载使用rpm方式安装的httpd #使用命令检查是否下载了httpd [rootserver ~]# rpm -qa httpd #如果有则使用 [rootserver ~]# rpm -e httpd --nodeps Apache的配置…

c语言插入排序及希尔排序详解

目录 前言&#xff1a; 插入排序&#xff1a; 希尔排序&#xff1a; 前言&#xff1a; 排序在我们生活中无处不在&#xff0c;比如学生成就排名&#xff0c;商品价格排名等等&#xff0c;所以排序在数据结构的学习中尤为重要&#xff0c;今天就为大家介绍两个经典的排序算法&…

异常处理详解

异常概述 什么是异常&#xff1f; 异常是程序在“编译”或者“执行”的过程中可能出现的问题&#xff0c;注意&#xff1a;语法错误不算在异常体系中。 比如:数组索引越界、空指针异常、 日期格式化异常&#xff0c;等。 为什么要学习异常? 异常一旦出现了&#xff0c;如果…

.9.png编译报错

android项目中使用9-patch图编译报错&#xff1a;AAPT: error: file failed to compile. 原因是因为.9.png图中有线之间断开或者黑点的存在&#xff0c;把线连上或者把黑点去掉就可以了。如下&#xff1a;

2024 年 SEO 现状

搜索引擎优化&#xff08;SEO&#xff09;一直以来都是网络知名度和成功的基石。随着我们踏上 2024 年的征程&#xff0c;SEO领域正在经历重大变革&#xff0c;有些变革已经开始&#xff0c;这对企业、创作者和营销人员来说既是挑战也是机遇。 语音搜索 语音搜索曾是一个未来…

Python爬取酷我音乐

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;喜欢的话麻烦您点个&#x1f44d;和⭐&#xff01; &#x1f388;…

用23种设计模式打造一个cocos creator的游戏框架----(十三)模板方法模式

1、模式标准 模式名称&#xff1a;模板方法模式 模式分类&#xff1a;行为型 模式意图&#xff1a;定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 结构图&#xff1a…

BigData之Google Hadoop中间件安装

前言 Hadoop / Zookeeper / Hbase 因资源有限 这三个都是安装在同一台Centos7.9的机器上 但通过配置 所以在逻辑上是distributed模式 1 Java安装 1.1 下载java11 tar/opt/java/jdk-11.0.5/ 1.2 环境配置修改 文件/etc/profile export JAVA_HOME/opt/java/jdk-11.0.5/ e…

【复现】vid2vid_zero

问题及解决方法总结。 code&#xff1a;GitHub - baaivision/vid2vid-zero: Zero-Shot Video Editing Using Off-The-Shelf Image Diffusion Models 1.AttributeError: UNet2DConditionModel object has no attribute encoder 据说是预训练模型结构不匹配&#xff0c;偷懒把a…

java工程(ajax/axios/postman)向请求头中添加消息

1、问题概述 在项目中我们经常会遇到需要向请求头中添加消息的场景&#xff0c;然后后端通过request.getRequest()或者RequestHeader获取请求头中的消息。 下面提供几种前端向请求头添加消息的方式 2、创建一个springmvc工程用于测试 2.1、创建工程并引入相关包信息 sprin…

家具制造ERP软件包含哪些功能?家具制造业ERP系统哪个好

不同的家具有不同的用料、品质、制造工时、营销渠道等&#xff0c;而有些家具制造企业采用传统的管理方式在处理物料BOM、生产实际成本核算、库存盘点、供应商选择、班组计件核对、生产领用以及物料追溯等方面存在不少提升空间。 与此同时也有很多的皮具制造企业借助ERP软件优…

​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案

随着“第四次工业革命”的爆炸式发展&#xff0c;众多企业都将自己的业务与迅速发展的应用开发和网站建设领域高度绑定。而对于众多有上云需求的企业和个人用户来说&#xff0c;选择一款自己的服务器配置就成为了一项至关重要的任务。而随着需求端的不断扩大&#xff0c;云服务…

宝塔PostgreSQL设置数据库远程访问

宝塔PostgreSQL设置数据库远程访问 宝塔的PostgreSQL1. 添加数据库2. 打开PostgreSQL设置界面3. 修改配置4. 重载配置/重启数据库 Docker的PostgreSQL1. postgresql.conf2. pg_hba.conf3. 重启数据库 注意其他问题 宝塔PostgreSQL设置数据库远程访问&#xff1f;docker容器Post…

arm-linux设备fsck命令移植

arm-linux设备fsck命令移植 文章目录 **arm-linux设备fsck命令移植**1、下载e2fsprogs-源码2、解压3、进入源码目录4、配置编译环境&#xff1a;使用以下命令配置交叉编译环境5、测试 1、下载e2fsprogs-源码 首先要确定自己的文件系统格式&#xff0c;IG2000的文件系统是ext4&…

【银行测试】第三方支付功能测试点+贷款常问面试题(详细)

前言 1、第三方支付功能测试点 支付流程&#xff1a; 我们在测试一个功能时&#xff0c;需要先了解一下这个逻辑&#xff0c;而订单支付逻辑普遍都会有以下内容&#xff1a; 1&#xff09;创建本地唯一订单号&#xff1b; 2&#xff09;去调用支付&#xff0c;在支付平台生…

kubeadm搭建单master多node的k8s集群--小白文,图文教程

参考文献 K8S基础知识与集群搭建 kubeadm搭建单master多node的k8s集群—主要参考这个博客&#xff0c;但是有坑&#xff0c;故贴出我自己的过程&#xff0c;坑会少很多 注意&#xff1a; 集群配置是&#xff1a;一台master&#xff1a;zabbixagent-k8smaster&#xff0c;两台…

pycharm手动安装包

1.下载对应的包 TTS PyPI 2.手动解压&#xff0c;找到文件放到pycharm对应项目的lib文件夹中 以TTS包为例&#xff0c;找到下载并解压的包中的2个文件&#xff0c;一个名称一个info结尾 3.放到项目的lib文件夹中 eg&#xff1a;路径&#xff1b;C:\doc\myProject\speaker\venv…

离散型随机变量的分布律(也称概率质量函数:probability mass function, PMF)

设是一个离散型随机变量&#xff0c;可能的取值为&#xff0c;取各个值的概率记为&#xff1a; &#xff08;1&#xff09; 其中 并且&#xff0c; 公式&#xff08;1&#xff09;就称为离散型随机变量的分布律&#xff0c;也称概率质量函数&#xff1a;probability ma…

【漏洞修复】Cisco IOS XE软件Web UI权限提升漏洞及修复方法

关于Cisco IOS XE软件Web UI权限提升漏洞及修复方法 文章目录 漏洞基本信息漏洞影响范围确认设备是否受影响漏洞修复方法推荐阅读 漏洞基本信息 Cisco IOS XE Unauthenticatd Remote Command Execution (CVE-2023-20198) (Direct Check) Severity:Critical Vulnerability Pri…