《玩转Redis》系列文章主要讲述Redis的基础及中高级应用。本文是《玩转Redis》系列第【9】篇,最新系列文章请前往公众号“zxiaofan”查看,或百度搜索“玩转Redis zxiaofan”即可。
本文关键字:玩转Redis、微博日活/月活、UV统计、HyperLogLog;
大纲
- 日活数据统计面临哪些挑战
- Bitmaps可用于统计日活吗?
- 日活数据统计的特点
- HyperLogLog介绍
- HyperLogLog必知
- HyperLogLog和Sets的区别
- HyperLogLog如何使用
- HyperLogLog命令对比分析
- HyperLogLog命令详解
- HyperLogLog命令注意事项
- HyperLogLog命令示例
- HyperLogLog的应用场景
名词解释
- DAU(Daily Active User)日活跃用户数量
常用于反映网站、互联网应用或网络游戏的运营情况。DAU通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户); - 月活跃用户数量(Monthly Active User,MAU)
月活跃用户数量通常统计一个月(统计月)之内,登录或使用了某个产品的用户数(去除重复登录的用户); - Note:日活、月活反映用户的活跃度,但是无法反映用户的粘性。
1. 日活数据统计面临哪些挑战
2020年2月26日,微博发布2019年第四季度及全年财报。数据显示,截至2019年底,微博月活跃用户达到5.16亿,相比2018年年底净增长约5400万,其中移动端占比94%。2019年微博全年营收提升至122.4亿元,其中广告营收达到106亿元。
1.1. Bitmaps可用于统计日活吗?
前文《玩转Redis-京东签到领京豆如何实现》提到了 Bitmaps 在大数据下的应用,那么Bitmaps可以用于统计日活数据吗?我们来做个计算分析(以一亿用户为例):
统计方式 | 占用计算 | 1亿用户占用空间(M) |
---|---|---|
MySQL 32bit的int数据类型 | 1个int所需存储空间为4字节,可存储32 bit位 | 10^8 / (1024 * 1024 * 8 / 32) ≈ 381 M |
Redis Bitmaps | Bitmaps单个支持512M,不像int单个仅存储32位 | 10^8 / (1024 * 1024 * 8) ≈ 12M |
使用Bitmaps计算日活月活:
- 计算日活:bitcount key获取key为1的数量;
- 计算月活:可把30天的所有bitmap做or计算,再进行bitcount计算;
- 计算留存率:昨日留存=昨天今天连续登录的人数/昨天登录的人数,即昨天的bitmap与今天的bitmap进行and计算,再除以昨天bitcount的数量。
通过以上计算,我们发现Bitmaps已经很节省空间了。统计一个网站的日活已不在话下,但是大型互联网公司除了日活,还有UV、PV等等需要统计。面对上千甚至更多的需统计模块,1个模块1天需要12M,一年就需要12M * 365 / 1024 ≈ 4.3G ,1000个模块一年就需要 12M * 365 / 1024 / 1024 ≈ 4.2T。So 革命尚未成功,我们还需再节省点!
1.2. 日活数据统计的特点
- 数据需要去重;
- 数据允许有一定的偏差,101W和102W差距不大;
- 占用空间尽可能小;
2. HyperLogLog介绍
2.1. HyperLogLog必知
HyperLogLog(HLL)是一种用于