4.千万日活的系统如何统计UV?

面对千万日活的统计系统,统计每日UV(独立访客数)是一个挑战。传统的Set集合方法存在内存占用大和性能下降的问题。Redis的HyperLogLog数据结构提供了一种不精确但误差极小的去重计数方案,适用于UV统计。其通过pfadd命令添加用户ID,pfcount返回不精确但足够准确的UV数量,有效解决了内存和性能问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HyperLogLog

假设有个千万日活的统计系统,需要统计系统每天的UV。如果是你的话你该怎么设计?

如果统计 PV 那非常好办,使用string的incr就搞定了。

但是 UV 不一样,它要去重,同一个用户一天之内的多次访问请求只能计数一次。这就要求每一个网页请求都需要带上用户的 ID,无论是登陆用户还是未登陆用户都需要一个唯一 ID 来标识。

我们第一反应就是为每一个页面搞一个独立的 set 集合来存储所有当天访问过此页面的用户 ID。当一个请求过来时,我们使用 sadd 将用户 ID 塞进去就可以了。通过 scard 可以取出这个集合的大小,这个数字就是这个页面的 UV 数据。没错,这是一个非常简单的方案。

存在问题:

①占用内存,set集合里有1000万条数据,如果一个用户ID占32个字节,一天就320M,这是非常恐怖的

②性能差,当数据量大时,sadd性能会下降

其实对于千万日活系统,老板需要的数据不需要太精确,1001万和1002万对于老板决策没有太大影响。

Redis 提供了 HyperLogLog 数据结构就是用来解决这种统计问题的。HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81%,这样的精确度已经可以满足上面的 UV 统计需求了。

常用命令

127.0.0.1:6379> pfadd uv user1 ## 将元素参数添加到 HyperLogLog 数据结构中
(integer) 1
127.0.0.1:6379> pfadd uv user2
(integer) 1
127.0.0.1:6379> pfadd uv user1
(integer) 0
127.0.0.1:6379> pfcount uv
(integer) 2
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值