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

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

本系列Redis 版本 7.2.5

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

文章目录

    • [1. 概述](#1. 概述)
    • [2. 常用命令](#2. 常用命令)
      • [2.1 PFADD](#2.1 PFADD)
      • [2.2 PFCOUNT](#2.2 PFCOUNT)
      • [2.3 PFMERGE](#2.3 PFMERGE)
    • [3. 应用场景](#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

基本语法:

java 复制代码
PFADD key element [element ...]

示例:

bash 复制代码
redis> PFADD hll a b c d e f g
(integer) 1
redis> PFCOUNT hll
(integer) 7

2.2 PFCOUNT

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

基本语法:

bash 复制代码
PFCOUNT key [key ...]

注意事项:

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

示例:

bash 复制代码
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 的并集的近似基数。

命令语法:

bash 复制代码
PFMERGE destkey sourcekey [sourcekey ...]

使用示例:

bash 复制代码
# 使用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

bash 复制代码
localhost:0>PFADD uv:20240624 1 2 3 
"1"
localhost:0>PFADD uv:20240624 2 3 5 
"1"

统计UV

bash 复制代码
localhost:0>PFCOUNT uv:20240624
"4"
相关推荐
weixin_440401692 小时前
分布式锁——基于Redis分布式锁
java·数据库·spring boot·redis·分布式
2401_854391085 小时前
缓存生命周期管理:探索Memcached的过期策略
数据库·缓存·memcached
三两肉5 小时前
如何使用缓存提升SpringBoot性能(EhCache和Redis方式)
spring boot·redis·缓存
JacksonChen_5 小时前
说一下浏览器中的强缓存和协商缓存的区别
缓存
陪我养猪吧7 小时前
Linux 服务器环境搭建
linux·服务器·redis·mysql·nginx·jdk·maven
givmchickenblood8 小时前
redis的setnx实现分布式锁
数据库·redis·分布式
清风撩耳ing8 小时前
Redis三种模式——主从复制、哨兵模式、集群
数据库·redis·nosql
鞥牧魂人11 小时前
数据库——redis常见面试题
数据库·redis·缓存
一橘Java小菜鸟12 小时前
利用Redis bitmap 实现签到案例
数据库·redis·缓存
青春丨猪头丨少年12 小时前
用Redis实现排行榜的详细用例
数据库·redis·缓存