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

07- Redis 中的 HyperLogLog 数据类型和应用场景

1. 介绍

Redis HyperLogLog 是 Redis 2.8.9 版本新增的数据类型,是一种用于【统计基数】的数据集合类型,基数统计就是指统计一个集合中不重复的元素个数。但要注意,HyperLogLog 的统计规则是基于概率完成的,不是非常准确,标准误算率是 0.81%。

所以,简单来说 HyperLogLog 提供不准确的去重计数

HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的内存空间总是固定的,并且是很小的。

在 Redis 中,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数,和元素越多就越耗费内存的 Set 和 Hash 类型相比,HyperLogLog 就非常节省空间。

这是什么概念?举个例子:

用 Java 语言来说,一般 long 类型占用 8 个字节,而 1 字节有 8 位,即:1 byte = 8 bit,即 long 数据类型最大可以表示的数是:2^63 - 1。对应上面的 2^64 个数,假设此时有 2^63 - 1 这么多个数,从 0 ~ 2^63-1,按照 long 以及 1 k = 1024 字节 的规则来计算内存总数,就是:(2^63-1)*8/1024K ,这是很庞大的一个数,存储空间远远超过 12 K,而 HyperLogLog 却可以用 12K 就能统计完。

2. 内部实现

HyperLogLog 的实现涉及到很多数学问题,太费脑子了,搞不懂。

3. 常见命令

HyperLogLog 命令很少,就三个。

# 添加指定元素到 HyperLogLog 中
PFADD key element [element ...]
​
# 返回给定 HyperLogLog 的基数估算值
PFCOUNT key [key ...]
​
# 将多个 HyperLogLog 合并为一个 HyperLogLog
PFMERGE destkey sourcekey [sourcekey ...]

4. 应用场景

4.1 百万级网页 UV 计数

Redis HyperLogLog 优势在于只需花费 12 KB 内存,就可以计算接近 2^64 个元素的基数,和元素越多就越耗费内存的 Set 和 Hash 类型相比,HyperLogLog 就非常节省空间。

所以,非常适合统计百万级以上的网页 UV(Unique Vistor 独立访客,衡量一个给定时间范围内访问网站的不同访客数量。) 的场景。

在统计 UV 时,你可以使用 PFADD 命令(用于向 HyperLogLog 中添加新元素)把访问页面的每个用户都添加到 HyperLogLog 中。

PFADD page1:uv user1 user2 user3 user4

接下来,就可以用 PFCOUNT 命令直接获得 page1 的 UV 值了,这个命令的作用就是返回 HyperLogLog 的统计结果。

PFCOUNT page:uv

不过,有一点需要注意一下,HyperLogLog 的统计规则是基于概率完成的,所以它给出的统计结果是有一定误差的,标准误算率是 0.81%。

这也就意味着,你使用 HyperLogLog 统计的 UV 是 100 万,但实际的 UV 可能是 101 万。虽然误差率不算大,但是,如果你需要准确统计结果的话,最好还是继续使用 Set 或 Hash 类型。

http://www.lryc.cn/news/360974.html

相关文章:

  • jenkins应用2-freestyle-job
  • K210视觉识别模块学习笔记1:第一个串口程序_程序烧录与开机启动
  • [数据集][目标检测]脑溢血检测数据集VOC+YOLO格式767张2类别
  • 如何借VR之手,让展厅互动更精彩?
  • 微信小程序如何使用地图
  • 力扣 287. 寻找重复数
  • 怎样清理Mac存储空间 苹果电脑内存不够用怎么办 苹果电脑内存满了怎么清理
  • 网络遗忘权的实现方法
  • 【Python内功心法】:深挖内置函数,释放语言潜能
  • JS-09-es6常用知识1
  • SpringBoot 基础之自动配置
  • Oracle dblink 发现Network 等待事件的分析 enq: KO - fast object checkpoint
  • SpringMVC:向三大域对象存数据
  • 如何用python做一个用户登录界面——浔川python社
  • Python知识点9---推导式
  • 用C++做一个跑酷游戏
  • 基于字典树可视化 COCA20000 词汇
  • TypeScript 中的命名空间
  • [C++] 小游戏 斗破苍穹 2.2.1至2.11.5全部版本(上) zty出品
  • 单元测试的心法分享
  • 【python】多线程(3)queue队列之不同延时时长的参数调用问题
  • Java开发常见基础问题
  • 大数据组件doc
  • Docker Hub 国内镜像源配置
  • 持续总结中!2024年面试必问 20 道 Kafka面试题(一)
  • Linux共享内存创建和删除
  • 微信小程序如何自定义tabbar
  • 【并发程序设计】15.信号灯(信号量)
  • 【操作与配置】VS2017与MFC环境配置
  • 遥感影像信息提取