Redis 实战篇:巧用数据类型实现亿级数据统计

本文探讨了如何使用Redis实现亿级数据的统计,包括基数统计、排序统计和聚合统计。重点介绍了HyperLogLog数据结构在不精确基数统计中的应用,如UV(Unique Visitor)计算,以及Set、Hash和Sorted Set在不同场景下的使用,如最新评论列表和排行榜。还提到了交集、差集和并集操作在聚合统计中的应用。
摘要由CSDN通过智能技术生成

在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合,同时还要对集合中的数据进行统计排序。

常见的场景如下:

  • 给一个 userId ,判断用户登陆状态;

  • 两亿用户最近 7 天的签到情况,统计 7 天内连续签到的用户总数;

  • 统计每天的新增与第二天的留存用户数;

  • 统计网站的对访客(Unique Visitor,UV)量

  • 最新评论列表

  • 根据播放量音乐榜单

通常情况下,我们面临的用户数量以及访问量都是巨大的,比如百万、千万级别的用户数量,或者千万级别、甚至亿级别的访问信息。

所以,我们必须要选择能够非常高效地统计大量数据(例如亿级)的集合类型。

如何选择合适的数据集合,我们首先要了解常用的统计模式,并运用合理的数据来解决实际问题。

四种统计类型:

  1. 二值状态统计;

  2. 聚合统计;

  3. 排序统计;

  4. 基数统计。

本文将用到 String、Set、Zset、List、hash 以外的拓展数据类型 BitmapHyperLogLog来实现。

文章涉及到的指令可以通过在线 Redis 客户端运行调试,地址:https://try.redis.io/,超方便的说。

基数统计

基数统计:统计一个集合中不重复元素的个数,常见于计算独立用户数(UV)。

实现基数统计最直接的方法,就是采用集合(Set)这种数据结构,当一个元素从未出现过时,便在集合中增加一个元素;如果出现过,那么集合仍保持不变。

当页面访问量巨大,就需要一个超大的 Set 集合来统计,将会浪费大量空间。

另外,这样的数据也不需要很精确,到底有没有更好的方案呢?

这个问题问得好,Redis 提供了 HyperLogLog 数据结构就是用来解决种种场景的统计问题。

HyperLogLog 是一种不精确的去重基数方案,它的统计规则是基于概率实现的,标准误差 0.81%,这样的精度足以满足 UV 统计需求了。

关于 HyperLogLog 的原理过于复杂,如果想要了解的请移步:

  • https://www.zhihu.com/question/53416615

  • https://en.wikipedia.org/wiki/HyperLogLog

网站的 UV

通过 Set 实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值