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) 1

192.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
string

192.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
string

192.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) 6

192.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) 1

192.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) 8

192.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
OK

192.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%。
  • 只是想统计独立总数、而不需要获取具体的单条数据。

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

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

相关文章

Centos硬盘操作合集

一、硬盘命令说明 lsblk 列出系统上的所有磁盘列表 查看磁盘列表 参数意义 blkid 列出硬盘UUID [rootzs ~]# blkid /dev/sda1: UUID"77dcd110-dad6-45b8-97d4-fa592dc56d07" TYPE"xfs" /dev/sda2: UUID"oDT0oD-LCIJ-Xh7r-lBfd-axLD-DRiN-Twa…

【coco】掩膜mask影像转coco格式txt(含python代码)

最近在做实例分割,遇到二值掩膜影像——coco格式txt的实例分割转换问题,困扰很久,不知道怎么转换,转出来的txt没法用代码成功读取。一系列问题,索性记录下自己的结局路程,方便大家python代码自取。 目录 &…

Python开发运维:Python调用K8S API实现资源管理

目录 一、实验 1.Python操作K8S API获取资源 2.Python操作K8S API创建deployment资源 3.Python操作K8S API删除k8s资源 4.Python操作K8S API修改k8s资源 5.Python操作K8S API查看k8s资源 二、问题 1.Windows11安装kubernetes报错 2.Python通过调用哪些方法实现Pod和De…

C4D云渲染怎么提升速度小技巧?C4D云渲染速度提升技巧

当许多C4D用户转向云渲染时,他们常常会发现渲染速度并没有预期中的提升,这让人产生疑问,为什么使用云渲染服务后,渲染时间依然没有显著缩短,C4D云渲染情况取决于多个因素,如:渲染任务特点以及所…

图的搜索(二):贝尔曼-福特算法、狄克斯特拉算法和A*算法

图的搜索(二):贝尔曼-福特算法、狄克斯特拉算法和A*算法 贝尔曼-福特算法 贝尔曼-福特(Bellman-Ford)算法是一种在图中求解最短路径问题的算法。最短路径问题就是在加权图指定了起点和终点的前提下,寻找从…

代码上传的gitee平台

1.首先我们访问工作台 - Gitee.com进行注册和登录 2.我们创建一个仓库: 3.在本地创建我们的项目 在这文件夹里面我们打开git bush,执行 一下操作: git init :初始化仓库 git status:检查状态 git add . :将当前文件…

【wimdows电脑上管理员账户与管理员身份的区别】

管理员账户 在控制面板的用户账户中,点击更改账户类型,可以看到目前的账户是“管理员账户”还是“标准账户”。 管理员身份 在快捷方式上右击,可以看到,可以选择以管理员身份运行该软件。 如何查看某个应用是否以管理员身份…

6.Jetson Orin Nano 系统在NVME SSD上备份与恢复

Jetson Orin Nano 系统在NVME SSD上备份与恢复 刚开始我也参考其它博主写的系统备份与恢复,由于我Jetson 的系统盘是1t的,用dd命令拷贝的到另外一个1t的硬盘里面时,总会出现硬盘空间不足的情况出现。只能从小硬盘容量往大硬盘容量拷贝&#…

单通道led线性驱动芯片推荐:SM2082EGS

单通道LED线性驱动芯片是一种用于控制LED灯的芯片,它能够提供恒定的电流输出,从而实现LED灯的稳定亮度调节。这种芯片主要由输入端、控制电路、放大器和输出端构成,通过控制输入端的电压和信号来调节LED的亮度。 单通道led线性驱动芯片推荐&a…

JAVA:乘除窗体的实现

目录 题目要求: 窗口的实现: try 和 catch 的用法: 思路大意: 关键代码的实现: 题目要求: 使用 try 和catch 方法完成乘法除法的异常处理和窗体的实现,如下图所示: 窗口的实…

国际著名书画艺术家敖特:连续三届荣获世界美术大赛金奖

敖特 敖特是一位备受国际认可的蒙古族书画艺术家,以其卓越的才华和杰出的艺术成就而脱颖而出。他的艺术简历显示了他在国内外艺术大赛中多次荣获金奖,并获得了白俄罗斯、俄罗斯等国的最高艺术成就奖项,进一步证明了他在国际艺术界的卓越地位…

MidJourney笔记(7)-Seeds

我相信很多人在使用MidJourney的时候,都会遇到一个问题,就是如何保持生成图像的一致性,或者相对一致性,差异性不是很大。此时,我们就需要引入一个seed值,类似给这个提示词生成的图片做一个id标识。 那这个seed值怎么使用? 其实,在我们每次生成的图片,都有有一个seed值…

【Spring教程27】Spring框架实战:一文教你轻松掌握PostMan工具的安装与使用技巧!轻松搞定API测试!!!

目录 1 PostMan简介2 PostMan安装3 PostMan使用3.1 创建WorkSpace工作空间3.2 发送请求3.3 保存当前请求 4 发送步骤总结 欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博…

【C语言:文件操作】

文章目录 1. 什么是文件1.1为什么有文件?1.2什么是文件1.3文件的分类1.4文件缓冲区 2.文件的打开与关闭2.1文件的打开(fopen)2.2文件的关闭(fclose) 3.顺序读写数据文件3.1读写字符3.2读写字符串3.3格式化读写3.4二进制读写 4.文件的随机读写4.1fseek4.2ftell4.3rew…

【docker】镜像使用(Nginx 示例)

查看本地镜像列表 docker images删除本地镜像 # docker rmi [容器 ID]docker rmi a6bd71f48f68 查找镜像 docker search nginx 参数介绍 NAME: 镜像仓库源的名称DESCRIPTION: 镜像的描述OFFICIAL: 是否 docker 官方发布STARS: 点赞、喜欢AUTOMATED: 自动构建。 拉去镜像 …

shopify商城开发 引用谷歌字体库 fonts.google.com

引用谷歌字体库 https://fonts.google.com/ <link rel"preconnect" href"https://fonts.googleapis.com"> <link rel"preconnect" href"https://fonts.gstatic.com" crossorigin> <link href"https://fonts.goo…

C语言——K /C语言内存函数

一、memcpy 使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); • 函数 memcpy 从 source 的位置开始向后复制num个字节的数据到destination指向的内存位置。 • 这个函数在遇到 \0 的时候并不会停下来。 • 如果source和destination有…

了解一下DHCP

DHCP的工作原理 本质&#xff1a; 1、物理网卡自身集成了DHCP的功能&#xff0c;为了请求获取合法、可用的IP 2、DHCP服务端核心功能在于&#xff1a;通过自定义的网段的地址池&#xff0c;来给与新加入的网络环境的设备以租约的方式分配合法IP 1.什么是DHCP 1.1DHCP定义 …

Java获取当前用户当前工作目录

方法一&#xff1a;使用System.getProperty(“user.dir”)函数可以获取用户当前工作目录 例如&#xff0c;Java工程的文件布局如下&#xff1a; 主类文件&#xff0c;获取用户当前的工作目录&#xff1a; package com.thb;public class Test5 {public static void main(Stri…

如何在Kali Linux安装Xrdp+cpolar内网穿透实现远程访问Kali系统

文章目录 前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于&#xff0c;它允许用户从远程位置访问Kali系统&#xff0c;而无需直接物理访…