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

Redis 7.x 系列【12】数据类型之基数统计(HyperLogLog)

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

文章目录

    • 1. 概述
    • 2. 常用命令
      • 2.1 PFADD
      • 2.2 PFCOUNT
      • 2.3 PFMERGE
    • 3. 应用场景

1. 概述

基数表示数据集中不重复元素的个数。例如 {1,2,2,3,4,5,5}中,基数集(不重复的元素)为 {1,2,3,4,5},那么该数据集的基数(不重复元素的个数)为5

Redis 2.8.9 版本引入了 HyperLogLog 用于基数统计的算法,用于估算一个集合中不同元素的数量(基数),在处理大量数据时具有显著的空间效率优势。

特点:

  • 空间效率:在输入元素的数量或体积非常大时,计算基数所需的空间总是固定的,并且很小。具体来说,每个 HyperLogLog 键只需要花费约12KB的内存,就可以估算接近2^64个不同元素的基数。
  • 误差:由于是估算算法,存在一定的误差,标准误差大约是 0.81%
  • 不存储元素:只会根据输入元素来计算基数,而不会存储输入元素本身,因此不能像集合那样返回输入的各个元素。

2. 常用命令

所有命令:

命名描述
PFADD添加指定元素到 HyperLogLog
PFCOUNT返回给定 HyperLogLog 的基数估算值
PFDEBUG内部命令,仅用于开发测试
PFMERGE将多个 HyperLogLog 合并为一个
PFSELFTEST内部命令,仅用于开发测试

2.1 PFADD

PFADD 命令将所有元素参数添加到 HyperLogLog 数据结构中。如果内部储存被修改了, 那么返回 1 , 否则返回 0

基本语法:

PFADD key element [element ...]

示例:

redis> PFADD hll a b c d e f g
(integer) 1
redis> PFCOUNT hll
(integer) 7

2.2 PFCOUNT

PFCOUNT 用于计算 HyperLogLog 集合的近似基数。

基本语法:

PFCOUNT key [key ...]

注意事项:

  • 因为 HyperLogLog 是一个近似数据结构,所以 PFCOUNT 返回的结果并不是精确的基数,但它在大多数情况下都足够接近真实值。
  • PFCOUNT 命令的时间复杂度是 O(1),无论 HyperLogLog 集合的大小如何,执行该命令所需的时间都是恒定的。

示例:

redis> PFADD hll foo bar zap
(integer) 1
redis> PFADD hll zap zap zap
(integer) 0
redis> PFADD hll foo bar
(integer) 0
redis> PFCOUNT hll
(integer) 3
redis> PFADD some-other-hll 1 2 3
(integer) 1
redis> PFCOUNT hll some-other-hll
(integer) 6

2.3 PFMERGE

PFMERGE 命令是用于将多个 sourcekey 合并到一个新的 destkey 中,合并后的 destkey 将包含所有源 sourcekey 的并集的近似基数。

命令语法:

PFMERGE destkey sourcekey [sourcekey ...]

使用示例:

# 使用PFADD命令向两个HyperLogLog键(hll1和hll2)中添加元素。
redis> PFADD hll1 foo bar zap a  
(integer) 1  
redis> PFADD hll2 a b c foo  
(integer) 1  
# PFMERGE命令将hll1和hll2合并到新的HyperLogLog键hll3中
redis> PFMERGE hll3 hll1 hll2  
OK  
# 使用PFCOUNT命令来验证hll3的基数是否等于hll1和hll2的并集的基数
redis> PFCOUNT hll3  
(integer) 6

3. 应用场景

常用于需要统计大量数据集合中不同元素数量的场景,如:

  • UV 统计:统计网站的独立访客数量。
  • PV统计:统计页面的浏览量
  • DAU/MAU统计:统计日活跃用户量(DAU)和月活跃用户量(MAU),以评估网站或应用的运营情况。

UV 统计,即独立访客(Unique Visitor)数量的统计,在网站分析和在线业务中是非常重要的指标。需要确保每个访问者的唯一标识是唯一的,以避免重复计数。

示例,添加访问的用户ID

localhost:0>PFADD uv:20240624 1 2 3 
"1"
localhost:0>PFADD uv:20240624 2 3 5 
"1"

统计UV

localhost:0>PFCOUNT uv:20240624
"4"
http://www.lryc.cn/news/386500.html

相关文章:

  • 开源大模型RAG企业本地知识库问答机器人-ChatWiki
  • 基于Java的蛋糕预定系统【附源码+LW】
  • Java框架的原理主要基于以下几个核心
  • 已解决javax.xml.bind.MarshalException:在RMI中,参数或返回值无法被编组的正确解决方法,亲测有效!!!
  • 仓库管理系统17--客户管理
  • 笔记本重装系统怎么操作? windows电脑重装系统,超实用的四种方法
  • 【高考志愿】计算机
  • 使用ExpandableListView创建可扩展列表
  • 酒店新零售模式,亚朵酒店众筹模式, 社交新零售商业模式
  • 2010-2023年 省级、地级市、地市州盟保障性住房面积数据
  • Java 语言特定指南
  • 国内多个库被 rsc 钉上 Go 耻辱柱。。。
  • elasticsearch源码分析-03选举集群状态
  • MySQL 重要参数优化
  • 软件测试之接口测试(Postman/Jmeter)
  • 14 卡尔曼滤波及代码实现
  • 计算机视觉 图像融合技术概览
  • 计算机网络课程实训:局域网方案设计与实现(基于ensp)
  • 【安全开发】内网扫描器
  • ESP32-C3模组上跑通MQTT(5)
  • Arduino - LED 矩阵
  • 设计模式 - Observer Pattern 观察者模式
  • 【面试系列】C++ 高频面试题
  • 程序猿大战Python——实现简单的图书馆系统操作
  • 液体粒子计数器的原理及常见型号选择 lighthouse代理商北京中邦兴业
  • Java知识点整理 16 — Spring Bean
  • Nvidia Jetson/RK3588+AI双目立体相机,适合各种割草机器人、扫地机器人、AGV等应用
  • springboot使用feign调用不依赖cloud
  • springboot中使用springboot cache
  • Promise,async/await的运用