《玩转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)是一种用于基数计算的概率数据结构,通俗的说就是支持集合中不重复元素的统计。

  常规基数计算需要准备一块内存空间用于存储已经计数的元素,避免某些元素被重复统计。Redis提供了一种用精度来换取内存空间的算法,标准误差低于1%。仅需要12K 就能完成统计(再加上HLL自身所需的一点bytes),如果HyperLogLog中的元素较少,所需内存空间更小。HyperLogLogs的标准误差是0.81%

  输入元素数量或体积非常大时,HLL所需空间固定且很小。12kb内存可计算接近 2^64 个不同元素的基数

  HyperLogLog虽然技术实现是一种 不同的数据结构,但底层依旧是Redis strings,所以可以使用GET命令获取序列化后的数据,使用SET命令反序列化数据存储到Redis。

2.2. HyperLogLog和Sets的区别

对比/数据类型 Sets HyperLogLog
是否实际存储统计元素 存储 不存储元素,仅存储存在的标记
增加元素 SADD PFADD
统计元素数量 SCARD PFCOUNT
删除元素 SREM 不支持删除元素

3. HyperLogLog如何使用

【HyperLogLog核心命令】:PFADD、PFCOUNT、PFMERGE;

3.1. HyperLogLog命令对比分析

命令 功能 参数
PFADD 添加元素到HLL数据结构 key element [element …]
PFCOUNT 返回HLL的基数值 key [key …]
PFMERGE 合并多个HLL结构数据到destkey destkey sourcekey [sourcekey …]

  HLL操作命令中的PF含义:HyperLogLog 数据结构的发明人 Philippe Flajolet 的首字母缩写。

3.2. HyperLogLog命令详解

3.3. HyperLogLog命令注意事项

  • PFADD仅存储标记,不存储元素本身;
  • PFCOUNT实际是一个write命令,执行PFCOUNT时可能会重新计算计数值并存储;
  • key有多个时,PFCOUNT会动态合并计算,并且计算结果不会被缓存,所以生产环境执行PFCOUNT时尽量避免带多个key;
  • key有多个时,PFCOUNT是先合并再计算,结果为多个对象合并<去重>后的基数值(注意:不是基数值之和);
  • PFMERGE计算的是sourcekey的并集;
  • 如果destkey已存在,则PFMERGE执行后destkey最终的结果是dest+source的并集;

3.4. HyperLogLog命令示例

// pfadd、pfcount 示例 @zxiaofan127.0.0.1:6379> pfadd hll 1
(integer) 1
127.0.0.1:6379> pfadd hll 1
(integer) 0
127.0.0.1:6379> pfadd hll 2 3 4
(integer) 1
127.0.0.1:6379> pfcount hll
(integer) 4
127.0.0.1:6379> pfcount hll:notexist
(integer) 0
127.0.0.1:6379> pfadd hll2 a b
(integer) 1
127.0.0.1:6379> pfcount hll2
(integer) 2
127.0.0.1:6379> pfcount hll hll2
(integer) 6
127.0.0.1:6379> get hll
"HYLL\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00A\xee\x84[v\x80Mt\x80Q,\x8cC\xf3"
127.0.0.1:6379> set hll:error error666
OK
127.0.0.1:6379> pfcount hll:error
(error) WRONGTYPE Key is not a valid HyperLogLog string value.
// pfmerge 示例 @zxiaofan127.0.0.1:6379> pfadd hllm1 1 2 3 4 5
(integer) 1
127.0.0.1:6379> pfadd hllm2 5 6 7 8
(integer) 1
127.0.0.1:6379> pfmerge hllm3 hllm1 hllm2
OK
127.0.0.1:6379> pfcount hllm3
(integer) 8127.0.0.1:6379> pfadd hllm4 7 8 9 10 11 12 14 14
(integer) 1
127.0.0.1:6379> pfmerge hllm4 hllm1 hllm2
OK
127.0.0.1:6379> pfcount hllm4
(integer) 13

4. HyperLogLog应用场景

4.1. 网站日活月活

  日活:每天一个HLL,用户登录时则PFADD HLL20200719 userID;
  月活:合并当月的所有日活数据,PFMERGE HLL202007 HLL20200701 HLL20200702 HLL20200703 …

4.2. 网页UV

  UV(Unique Visitor)独立访客:1天内;cookie为标识;相同的客户端多次访问只计为1个访客。
  比如老板想实时查看公司网站某些页面从今天0点到现在被多少独立访客访问。

4.3. 其他场景场景

  • 搜索引擎关键词搜索量;
  • 用户在线人数统计;
  • 基于基数计数的数据分析场景。

【玩转Redis系列文章 @zxiaofan】
《玩转Redis-京东签到领京豆如何实现》

《玩转Redis-老板带你深入理解分布式锁》

《玩转Redis-如何高效访问Redis中的海量数据》

《玩转Redis-高级程序员必知的Key命令》

《玩转Redis-研发也应该知道的Connection命令》

《玩转Redis-Redis高级数据结构及核心命令-ZSet》

《玩转Redis-Redis基础数据结构及核心命令》

《玩转Redis-Redis安装、后台启动、卸载》


祝君好运!

Life is all about choices!

将来的你一定会感激现在拼命的自己!

【CSDN】【GitHub】【OSCHINA】【掘金】【语雀】【微信公众号】


玩转Redis-HyperLogLog统计微博日活月活相关推荐

  1. redis统计用户日活量_玩转Redis-HyperLogLog统计微博日活月活

    <玩转Redis>系列文章主要讲述Redis的基础及中高级应用.本文是<玩转Redis>系列第[9]篇,最新系列文章请前往公众号"zxiaofan"查看,或 ...

  2. 怎么往integer型数组添加数据_用户日活月活怎么统计 - Redis HyperLogLog 详解

    HyperLogLog 是一种概率数据结构,用来估算数据的基数.数据集可以是网站访客的 IP 地址,E-mail 邮箱或者用户 ID. 基数就是指一个集合中不同值的数目,比如 a, b, c, d 的 ...

  3. 用户日活月活怎么统计 - Redis HyperLogLog 详解

    点击上方"程序员历小冰",选择"置顶或者星标" 你的关注意义重大! HyperLogLog 是一种概率数据结构,用来估算数据的基数.数据集可以是网站访客的 IP ...

  4. 使用WGCLOUD来统计用户日活周活月活

    什么是日活,什么是月活,统计了有什么意义? 日活的概念即一天之内打开某产品的用户数(去重),也就是说一个人打开100次,即计算为1个日活,但是100个人,每人只开1次,也计算为100个日活. 月活的概 ...

  5. 什么是影响日活/月活的因素?先天决定论vs.后天培养论

    意想不到的是,要想判断你的产品是否做到了与市场匹配是一件很困难的事情,主要原因之一就是要想得到有可比性的数字非常困难,甚至可遇而不可求.你不得不去比较类别相近或相同的产品来看一看,然而有时,这些比较难 ...

  6. PV UV 日活 月活

    PV,即Page View,表示页面浏览量或者点击量,每当一个页面被打开或者被刷新,都会产生一次PV,只要这个请求从浏览器端发送到了服务器端 UV,即Unique Visitor,表示独立访客数 日活 ...

  7. redis——HyperLogLog

    HyperLogLog 是一种概率数据结构,用来估算数据的基数.数据集可以是网站访客的 IP 地址,E-mail 邮箱或者用户 ID. 基数就是指一个集合中不同值的数目,比如 a, b, c, d 的 ...

  8. 什么是日活,什么是月活,统计了有什么意义?

    你有没有认真的考虑过日活和月活是怎么计算的,它们的背后具有怎样的逻辑定义? 一直以来都是做微信内的产品比较多,包括公众号,小程序.以往看数据,说到日活.月活,很理所当然的就想到了微信后台给提供的数据. ...

  9. 产品经理(002)-DAU top10,日活,月活,服务不同类型的公司

    目录 二.针对不同的服务对象 三.技能 四.产品经理需要交付的东西: 五.DAU Top10 六.查数据网站 七.案例-滴滴 一.日活.月活解释 日活(DAU):每日 月活(MAU):每月 10-15 ...

最新文章

  1. 微信新版支持读取iPhone M7/M8协处理器运动数据 与好友PK一下运动量吧
  2. SQL Server AlwaysOn中的几个误区
  3. iOS高级-RunLooper
  4. zigbee 万能遥控器 裸机发送和协议栈发送
  5. 深入浅出学Hive:Hive体系结构
  6. VMware安装以及安装Window7教程
  7. Loj #6274. 数字 数位dp + 去重
  8. Linux Shell脚本专栏_服务器系统配置初始化脚本_01
  9. 面试:一文搞懂 final 关键字的作用
  10. JS: 浅拷贝vs深拷贝 | 刷题打卡
  11. 20172328《程序设计与数据结构》第三周学习总结
  12. foreach 和 list.foreach 初步测试
  13. WDM驱动开发 电源管理
  14. Nmap端口扫描windows版
  15. HTML页面浏览历史,浏览历史记录功能
  16. 【清华大学】操作系统 陈渝 Part2 —— 中断、异常和系统调用
  17. 【Day7.1】张掖七彩丹霞看日出
  18. 数据库管理工具的使用
  19. 旧金山大学的算法可视化学习教程 赞的教程,将抽象的算法可视化,易于理解
  20. 主动扫描系列文章(2):masscan/zmap扫描主机与端口

热门文章

  1. Grid ++ MIME 类型配置 载入报表数据,检查此URL及其数据,错误提示 网络服务器响应不成功
  2. RTX30系列-Ubuntu系统配置与深度学习环境Pytorch配置
  3. 51单片机入门学习 第七天
  4. 建议各位站长网站404页面换成腾讯宝贝回家公益页面,为社会公益出一份力
  5. TensorFlow下用自己的数据训练Fater-RCNN
  6. java 骑士飞行棋_C#实现骑士飞行棋
  7. 【包运行】Java 实现图形界面的邮件轰炸机附带视频指导教程
  8. sfm算法之三角化(三角测量)
  9. Python下opencv使用笔记(二)(简单几何图像绘制)
  10. Activiti整合Spring (Mysql8.0版本)