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

【redis】数据类型之hyperloglog

Redis的HyperLogLog(HLL)是一种高效的概率数据结构,也是一种基于字符串的数据结构,用于估计大数据集的唯一元素数量(基数统计)。它通过极低的内存占用(约 12KB)实现接近线性的时间复杂度,适用于海量数据去重计数场景(如统计独立访客数),但需容忍约0.81%的标准误差。

有关hyperloglog类型的命令可以通过help @hyperloglog命令来查看。有关命令的使用可以通过help 命令来查看,例如help pfadd

核心特性

低内存消耗:即使统计上亿甚至几十亿的数量级,每个HyperLogLog键仅占用12KB内存,无论元素数量多少(极端情况下最多占用64KB)。

高效合并:支持多组HyperLogLog的合并去重(PFMERGE),并且复杂度也是O(1),适合分布式统计(如多日数据合并为周/月统计)。

去重能力:自动忽略重复元素,多次添加同一元素不会影响结果。

计算复杂度低:其插入、查询操作的复杂度都是O(1),这使得它在处理大规模数据集时具有非常高的效率。

结果是估计值:虽然HyperLogLog提供的是基数估计值,但误差非常小,标准误差率可以控制在0.81%以内。

命令的使用

PFADD

PFADD:将一个或多个元素添加到HyperLogLog中,用于估算基数。

语法:

PFADD key element [element ...]

使用:

127.0.0.1:6379> pfadd visits:20990101 user1 user2
(integer) 1127.0.0.1:6379> pfadd visits:20990102 user2 user3
(integer) 1

PFCOUNT

PFCOUNT:返回一个或多个HyperLogLog的估算基数。。

语法:

PFCOUNT key [key ...]

使用:

# 统计单日独立用户
127.0.0.1:6379> pfcount visits:20990101
(integer) 2# 合并两日数据
127.0.0.1:6379> pfcount visits:20990101 visits:20990102
(integer) 3

PFMERGE

PFMERGE:将一个或多个HyperLogLog合并到另一个HyperLogLog中,用于合并不同数据集的基数估算。

语法:

PFMERGE destkey sourcekey [sourcekey ...]

使用:

127.0.0.1:6379> pfmerge visits:week visits:20990101 visits:20990102
OK127.0.0.1:6379> pfcount visits:week
(integer) 3

实现原理

在Redis中,HyperLogLog的存储也是个字符串,只不过这个字符串有个固定格式的头部(16字节),包括魔术字符串、编码方式、保留字段、缓存的基数以及数据字节等。

HyperLogLog的工作原理基于概率算法和哈希函数。它对要加入的每个新元素进行哈希处理,哈希值的一部分用于索引寄存器(将原始集合分成多个子集),另一部分用于计算哈希中最长的前导零序列。HyperLogLog根据寄存器数组中的值(这些寄存器被设置为迄今为止针对给定子集观察到的最大连续零),计算出估计的基数,并应用修正公式来纠正估计误差。

具体来说,Redis中HyperLogLog使用64bit的哈希函数,其中14bit用于寄存器索引,剩下的50bit用于计算前导0的个数。Redis中HLL有16384(2^14)个寄存器,其中存的值的范围是0~50。

哈希与二进制转换

每个元素通过哈希函数(如MurmurHash)转换为固定长度(如64位)的二进制串。

作用:哈希保证元素分布均匀,避免数据倾斜导致的统计偏差。

分桶策略(Bucketing)

分桶规则:取哈希值前14位确定桶编号,一共2^14=16384个桶,后50位计算最长前导零数量。

基数估算公式

调和平均数:降低极端值影响,计算所有桶的调和均值 H
H = m ∑ i = 1 m 1 2 k i H = \frac{m}{\sum_{i=1}^{m} \frac{1}{2^{k_i}}} H=i=1m2ki1m

修正系数:最终基数估算值:
E = α ⋅ m ⋅ H E = \alpha \cdot m \cdot H E=αmH

其中 α 为修正系数(如 m=16384α≈0.7213)。

误差控制与优化

标准误差:1.04/√m,Redis实现误差约0.81%

小数据集修正:当估算值 E < 2.5m 时,使用线性计数(Linear Counting)优化结果。

为了节省内存空间,HyperLogLog内部会采用不同的编码方式进行存储:

  • 稀疏编码(默认):应对数据量小的场景。
  • 密集编码:应对数据量大的场景。

适用场景

由于HyperLogLog具有高效存储、概率估计和高速计算等特点,因此它非常适用于以下场景:

  • 基数统计:网站UV统计、统计每日/月的独立访客数。

  • 数据流量分析:例如分析用户在某个时间段内访问的不同页面数、点击不同广告的用户数等。

  • 实时分析:高频事件(如搜索关键词)的去重计数。

  • 大规模日志处理:快速估算日志中唯一IP或错误类型数量。

注意事项

  • 误差范围:标准误差约0.81%,实际误差可能因数据分布略高。

  • 非精确查询:无法获取具体元素或判断元素是否存在。

  • 小数据集优化:Redis在基数较小时使用稀疏存储优化空间。

Java中的使用

package com.morris.redis.demo.hyperloglog;import org.redisson.Redisson;
import org.redisson.api.RHyperLogLog;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.redisson.config.Config;import java.util.Arrays;/*** redisson中hyperloglog的使用*/
public class RedissonHyperLogLogDemo {public static void main(String[] args) {// 配置Redisson客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 创建Redisson客户端实例RedissonClient redisson = Redisson.create(config);// 创建hyperloglogRHyperLogLog<Object> hyperLogLog1 = redisson.getHyperLogLog("visits:20880101", StringCodec.INSTANCE);hyperLogLog1.add("user1");hyperLogLog1.addAll(Arrays.asList("user2", "user3"));RHyperLogLog<Object> hyperLogLog2 = redisson.getHyperLogLog("visits:20880102", StringCodec.INSTANCE);hyperLogLog2.add("user2");hyperLogLog2.addAll(Arrays.asList("user3", "user4"));System.out.println(hyperLogLog1.count()); // 3System.out.println(hyperLogLog1.countWith("visits:20880102")); // 4RHyperLogLog<Object> hyperLogLogWeek = redisson.getHyperLogLog("visits:week", StringCodec.INSTANCE);hyperLogLogWeek.mergeWith("visits:20880101", "visits:20880102");System.out.println(hyperLogLogWeek.count()); // 4// 关闭客户端redisson.shutdown();}
}

相关文章:

【redis】数据类型之hyperloglog

Redis的HyperLogLog&#xff08;HLL&#xff09;是一种高效的概率数据结构&#xff0c;也是一种基于字符串的数据结构&#xff0c;用于估计大数据集的唯一元素数量&#xff08;基数统计&#xff09;。它通过极低的内存占用&#xff08;约 12KB&#xff09;实现接近线性的时间复…...

在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间

在 compare-form.vue 中添加 compareDate 隐藏字段&#xff0c;并在提交时自动填入当前时间。 提交表单时存入的对象是FakeRegistration&#xff0c;这个对象里面有compareDate字段&#xff0c;刚好表格查询的对象也是FakeRegistration&#xff0c;所以表格展示的时间就是刚才…...

Chat2File - DeepSeek Chat 导出助手:解决deepseek对话导出问题,提升开发效率

Chat2File - DeepSeek Chat 导出助手&#xff1a;解决deepseek对话导出问题&#xff0c;提升开发效率 大家好久不见&#xff0c;最近这段时间一直在开发一些项目&#xff0c;今天给大家带来一款刚在 Edge 成功上线的实用插件 ——Chat2File - DeepSeek Chat 导出助手。作为开发…...

MEMS光纤麦克风传感器特色解析

概念原理 光纤麦克风是利用光纤作为传光介质和传感元件&#xff0c;将声音信号转换为光信号&#xff0c;并通过对光信号的检测和处理来获取声音信息的设备。它区别于传统基于电信号转换的麦克风&#xff0c;利用光的特性来实现声音的传感与传输。  原理&#xff1a;声音引起敏…...

LLC谐振变换器恒压恒流双竞争闭环simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09;针对全桥LLC拓扑&#xff0c;利用Matlab软件搭建模型&#xff0c;分别对轻载&#xf…...

山东大学软件学院ai导论实验之生成对抗网络

目录 实验目的 实验代码 实验内容 实验结果 实验目的 基于Pytorch搭建一个生成对抗网络&#xff0c;使用MNIST数据集。 实验代码 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data…...

C++ Qt常见面试题(2):QT中的文件流(QTextStream)和数据流(QDataStream)的区别

在 Qt 中,QTextStream 和 QDataStream 是两种常用的流类,用于通过文件或其他 I/O 设备(如网络、内存)读写数据。虽然它们都可以用来操作数据,但它们的设计目标和使用场景不同。以下是它们的主要区别和适用场景的详细说明: 1. QTextStream:文本流 QTextStream 是一种专门…...

入门网络安全工程师要学习哪些内容【2025年寒假最新学习计划】

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网…...

【论文解读】《C-Pack: Packed Resources For General Chinese Embeddings》

论文链接&#xff1a;https://arxiv.org/pdf/2309.07597 本论文旨在构建一套通用中文文本嵌入的完整资源包——C-Pack&#xff0c;解决当前中文文本嵌入研究中数据、模型、训练策略与评测基准缺失的问题。论文主要贡献体现在以下几个方面&#xff1a; 大规模训练数据&#xf…...

Cramér-Rao界:参数估计精度的“理论底线”

Cramr-Rao界&#xff1a;参数估计精度的“理论底线” 在统计学中&#xff0c;当我们用数据估计一个模型的参数时&#xff0c;总希望估计结果尽可能精确。但精度有没有一个理论上的“底线”呢&#xff1f;答案是有的&#xff0c;这就是Cramr-Rao界&#xff08;Cramr-Rao Lower …...

ClickHouse 的分区、分桶和分片详解

在大数据场景下&#xff0c;数据的存储和查询效率至关重要。ClickHouse 作为一款高性能的列式存储数据库&#xff0c;提供了多种数据组织方式来优化存储和查询&#xff0c;其中最常见的就是 分区&#xff08;Partition&#xff09;、分桶&#xff08;Sampling&#xff09;、分片…...

【操作系统、数学】什么是排队论?如何理解排队论?排队论有什么用处?Queueing Theory?什么是 Little’s Law?

排队论&#xff08;Queueing Theory&#xff09;是研究系统中排队现象的数学理论&#xff0c;旨在分析资源分配、服务效率及等待时间等问题。它广泛应用于计算机科学、通信网络、交通规划、工业工程等领域。 【下文会通过搜集的资料&#xff0c;从各方面了解排队论&#xff0c…...

2209. 用地毯覆盖后的最少白色砖块

2209. 用地毯覆盖后的最少白色砖块 题目链接&#xff1a;2209. 用地毯覆盖后的最少白色砖块 代码如下&#xff1a; class Solution { public:int minimumWhiteTiles(string floor, int numCarpets, int carpetLen) {vector<vector<int>>memo (numCarpets 1, vec…...

DeepSeek赋能大模型内容安全,网易易盾AIGC内容风控解决方案三大升级

在近两年由AI引发的生产力革命的背后&#xff0c;一场关乎数字世界秩序的攻防战正在上演&#xff1a;AI生成的深度伪造视频导致企业品牌声誉损失日均超千万&#xff0c;批量生成的侵权内容使版权纠纷量与日俱增&#xff0c;黑灰产利用AI技术持续发起欺诈攻击。 与此同时&#…...

(0)阿里云大模型ACP-考试回忆

这两天通过了阿里云大模型ACP考试&#xff0c;由于之前在网上没有找到真题&#xff0c;导致第一次考试没有过&#xff0c;后面又重新学习了一遍文档才顺利通过考试&#xff0c;这两次考试内容感觉考试题目90%内容是覆盖的&#xff0c;后面准备分享一下每一章的考题&#xff0c;…...

0.【深度学习YOLOV11项目实战-项目安装教程】(图文教程,超级详细)

目录 前言一、安装Pycharm&#xff08;安装过Pycharm的跳过这一步&#xff09;1.1 点击下述链接直接跳转到教程页面进行安装 二、安装Anaconda&#xff08;安装过Anaconda的跳过这一步&#xff09;2.1 点击下述链接直接跳转到教程页面进行安装 三、后续安装教程&#xff08;有N…...

Docker 部署 Jenkins持续集成(CI)工具

[TOC](Docker 部署 Jenkins持续集成(CI)工具) 前言 Jenkins 是一个流行的开源自动化工具&#xff0c;广泛应用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;的环境中。通过 Docker 部署 Jenkins&#xff0c;可以简化安装和配置过程&#xff0c;并…...

布署elfk-准备工作

建议申请5台机器部署elfk&#xff1a; filebeat(每台app)--> logstash(2台keepalived)--> elasticsearch(3台)--> kibana(部署es上)采集输出 处理转发 分布式存储 展示 ELK中文社区: 搜索客&#xff0c;搜索人自己的社区 官方…...

uniapp 小程序如何实现大模型流式交互?前端SSE技术完整实现解析

文章目录 一、背景概述二、核心流程图解三、代码模块详解1. UTF-8解码器&#xff08;处理二进制流&#xff09;2. 请求控制器&#xff08;核心通信模块&#xff09;3. 流式请求处理器&#xff08;分块接收&#xff09;4. 数据解析器&#xff08;处理SSE格式&#xff09;5. 回调…...

微软推出Office免费版,限制诸多,只能编辑不能保存到本地

易采游戏网2月25日独家消息&#xff1a;微软宣布推出一款免费的Office版本&#xff0c;允许用户进行基础文档编辑操作&#xff0c;但限制颇多&#xff0c;其中最引人关注的是用户无法将文件保存到本地。这一举措引发了广泛讨论&#xff0c;业界人士对其背后的商业策略和用户体验…...

《ArkTS鸿蒙应用开发入门到实战》—新手小白学习鸿蒙的推荐工具书!

《ArkTS鸿蒙应用开发入门到实战》—新手小白学习鸿蒙的推荐工具书&#xff01; 在科技日新月异的今天&#xff0c;鸿蒙操作系统&#xff08;HarmonyOS&#xff09;作为华为推出的全新操作系统&#xff0c;正迅速进入越来越多的智能设备&#xff0c;成为物联网和智能硬件领域的…...

销售成交九步思维魔方

销售成交九步思维魔方 点 一、确定需求 原则1&#xff1a;问题是需求的前身原则2&#xff1a;基于问题才做决定原则3&#xff1a;人只解决大的问题 二、塑造价值 USP 利益 快乐 痛苦 价值 线 三、销售准备 精神上的准备 体能上的准备 产品知识准备 彻底了解顾客背景 …...

橄榄球、棒球项目排名·棒球1号位

美国四大体育联盟按照规模、影响力等因素综合排名&#xff0c;通常认为是&#xff1a; 1. NFL&#xff08;国家橄榄球联盟&#xff09;&#xff1a;成立于1920年&#xff0c;是北美四大职业体育运动联盟之首&#xff0c;也是世界上最大的职业美式橄榄球联盟。由32支球队组成&am…...

DeepSeek 提示词:高效的提示词设计

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

AI硬件加速的核心:深入探讨AI加速芯片模组的设计与应用

随着人工智能应用的普及&#xff0c;传统的计算架构已无法满足大规模深度学习模型训练和推理的需求。为了加速计算过程并提高能效&#xff0c;AI加速芯片应运而生。本文将介绍AI加速芯片模组的关键技术、发展趋势以及在各类应用中的重要性。 AI加速芯片模组的定义与构成 AI加速…...

LangChain:Models、Prompts、Indexes、Memory、Chains、Agents。MaxKB

LangChain:Models、Prompts、Indexes、Memory、Chains、Agents 在LangChain框架中,Models、Prompts、Indexes、Memory、Chains、Agents是六大核心抽象概念,它们各自承担独特功能,相互协作以助力开发者基于大语言模型构建高效智能应用。 Models(模型):指代各类大语言模型…...

html中的css

css &#xff08;cascading style sheets&#xff0c;串联样式表&#xff0c;也叫层叠样式表&#xff09; css规范一般约定&#xff1a; 1.存放CSS样式文件的目录一般命名为style或css。 2.在项目初期&#xff0c;会把不同类别的样式放于不同的CSS文件&#xff0c;是为了CSS编…...

JAVA面试常见题_基础部分_Dubbo面试题(上)

Dubbo 支持哪些协议&#xff0c;每种协议的应用场景&#xff0c;优缺点&#xff1f; • dubbo&#xff1a; 单一长连接和 NIO 异步通讯&#xff0c;适合大并发小数据量的服务调用&#xff0c;以及消费者远大于提供者。传输协议 TCP&#xff0c;异步&#xff0c;Hessian 序列化…...

Binder通信协议

目录 一,整体架构 二,Binder通信协议 一,整体架构 二,Binder通信协议...

解决应用程序 0xc00000142 错误:完整修复指南

&#x1f4a5; 0xc00000142 错误出现的场景 你是不是遇到这样的情况&#xff1a; &#x1f539; 点击某个软件&#xff0c;突然弹出“应用程序无法正确启动(0xc00000142)” &#xff1f; &#x1f539; 明明安装了所有必要组件&#xff0c;软件却始终打不开&#xff1f; &…...