前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 数据类型 HyperLogLog

Redis 数据类型 HyperLogLog

作者头像
用户1278550
发布2023-09-04 12:30:44
1690
发布2023-09-04 12:30:44
举报
文章被收录于专栏:idba

一 介绍

Redis HyperLogLog 是 Redis 2.8.9 版本新增的数据类型,是一种用于「统计基数」的数据集合类型,基数统计就是指统计一个集合中不重复的元素个数

注意,HyperLogLog 是统计规则是基于概率完成的,不是非常准确,标准误算率是 0.81%。

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

HyperLogLog 的优点: 在输入元素的数量或者体积非常非常大时,计算基数所需的内存空间总是固定的、并且是很小的。比如常见的 统计网站的 UV 数据。

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

二 常见命令

HyperLogLog 命令只有三个,非常简单。

添加指定元素到 HyperLogLog 中

PFADD key element [element ...]

返回给定 HyperLogLog 的基数估算值。

PFCOUNT key [key ...]

将多个 HyperLogLog 合并为一个 HyperLogLog

PFMERGE destkey sourcekey [sourcekey ...]

三 应用场景

3.1 百万级网页 UV 计数

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

所以,非常适合统计百万级以上的网页 UV 的场景。UV 和统计PV 不一样,UV 需要去重,同一个用户一天访问多次页面只记录一次。当然我们可以为每一个页面设置独立的 set 集合来存储所有访问该页面的userid 信息,然后使用 scard 获取该集合的大小,该值就是这个页面的 UV .

但是当一个页面是有数千万,数亿访问量的时候, 这个set 集合必然占用非常大的存储空间,带来 Redis 性能和运维稳定性风险。

考虑到 UV 的统计数据不需要非常精确,1000w UV 和 1001w 实际相差不大,对用户感受而言也没有那么敏感。

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

pfadd web_page1:uv user1 user2 user3 user4 user5

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

pfcount web_page1:uv

在命令行真实模拟一下: 创建访问 web_page1的uv 统计, user1 user2 user3 user4 访问了页面 page1 ,然后 user1 user2 user6 user7 访问该页面,其中user1 user2 属于重复访问,使用 pfcount统计该页面的UV 最终是6 ,user1 user2 第二次访问被去重。

代码语言:javascript
复制
127.0.0.1:6379> pfadd web_page1:uv  user1 user2  user3 user4
(integer) 1
127.0.0.1:6379> pfcount  web_page1:uv
(integer) 4## 模拟user1 user2 重复访问页面
127.0.0.1:6379> pfadd web_page1:uv  user1 user2 user6 user7
(integer) 1
127.0.0.1:6379> pfcount  web_page1:uv
(integer) 6

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

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

业务数据库设计没有银弹,都是 各种折中。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yangyidba 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二 常见命令
    • 添加指定元素到 HyperLogLog 中
      • 返回给定 HyperLogLog 的基数估算值。
        • 将多个 HyperLogLog 合并为一个 HyperLogLog
        • 三 应用场景
          • 3.1 百万级网页 UV 计数
          相关产品与服务
          云数据库 Redis
          腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档