原文在这里: 如何用redis做活跃用户统计-HyperLoglog

网站经常有这样的需求:统计日活用户数,有哪些实现方式呢?

第一种做法:用redis的set集合。
用户登录以后,把用户id添加到redis的set中,set会自动进行去重,类似于这样:

127.0.0.1:6379> sadd users_2019_06_17 user1
(integer) 1
127.0.0.1:6379> sadd users_2019_06_17 user2
(integer) 1
127.0.0.1:6379> sadd users_2019_06_17 user3
(integer) 1

很显然,只需要一条scard命令:

127.0.0.1:6379> scard users_2019_06_17
(integer) 3

可以看出来,2019年6月17号的用户数是3个。
很简单,但是集合只适用于用户数比较少的场合,假如用户有100万,set存储100万个id号,如果一个id号占32个字节,总共就是差不多32M,一个月就是960M 差不多一个G了!

第二种做法:用Bitmap。
我们存放100万个id号需要100万个bit位,也就是100万/8 = 125K字节,直接用以id号和100万取余,余数作为bit的索引:

127.0.0.1:6379> setbit login_2019_06_17  10000 1
(integer) 0
127.0.0.1:6379> setbit login_2019_06_17  1024 1
(integer) 0
127.0.0.1:6379> setbit login_2019_06_17  238 1
(integer) 0
127.0.0.1:6379> setbit login_2019_06_17  3434 1
(integer) 0

这时候同样,只要一条bitcount就能查出来用户数:

127.0.0.1:6379> bitcount login_2019_06_17
(integer) 4

此时存储100万个用户,只需要125K个字节,一个月才4M。
还有没有占存储空间更少的办法?

第三种办法:用redis的HyperLogLog

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
原理很复杂就不说了,只说下用法:

127.0.0.1:6379> pfadd login.2019_06_17 user1
(integer) 1
127.0.0.1:6379>  pfadd login.2019_06_17 user2
(integer) 1
127.0.0.1:6379>  pfadd login.2019_06_17 user3
(integer) 1
127.0.0.1:6379>  pfadd login.2019_06_17 user4
(integer) 1
127.0.0.1:6379> pfcount login.2019_06_17
(integer) 4

此时存储100万个独立用户只需要15K左右,一个月才480K左右!
需要注意的是HyperLogLog的统计结果并不是一个精确的值,误差在0.81%左右,但是对于统计用户数这种场景来说足够了。
如果感觉有用,欢迎扫码加关注【爪哇优太儿】

如何用redis做活跃用户统计-HyperLoglog相关推荐

  1. Springboot+redis 做实时在线人数统计

    Springboot+redis 做实时在线人数统计 介绍 实现 介绍 利用redis 有序集合实现. Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员. 不同的是 ...

  2. PHP通过Redis做uv/pv统计

    /*** php通过redis做uv/pv统计*/ $redis = new redis(); $dates = date("Y-m-d"); //统计uv 把ip添加入集合,假如 ...

  3. 数据统计之日活跃用户统计

    日活跃用户统计 接口分析 请求方式:GET /meiduo_admin/statistical/day_active/ # 日活跃用户统计url(r'^statistical/day_active/$ ...

  4. 【django项目后台开发】数据统计——用户总数统计、日增用户数统计、日活跃用户统计(3)

    一.用户总数统计 1.后端接⼝设计 请求⽅式: GET /statistics/total_count/ 请求参数: 通过请求头传递jwt token数据. 返回数据: JSON { "co ...

  5. SparkCore项目实战 需求一Top10热门品类 需求二Top10热门品类下每个品类的Top10活跃用户统计 需求三计算页面单跳转换率

    目录 数据格式简介 需求一:Top10热门品类(普通算子实现) 优化:需求一(使用ReduceByKey进行预聚合) 优化:需求一(采用累加器,避免shuffle过程) 需求二:Top10热门品类下每 ...

  6. redis位图法统计活跃用户+统计3天的连续登录用户案例

    Setbit 场景: 1亿个用户, 每个用户 登陆/做任意操作 ,记为今天活跃,否则记为不活跃 用法 周一:1001 0001 1001 0101 1011 0101 周二:1101 0001 101 ...

  7. 我是如何用 Redis 做实时订阅推送的?

    前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下领劵中心的项目吧,这个项目就类似京东app的领劵中心,当然图是截取京东的,公司的就不截了... 其中有一个功能叫做领 ...

  8. 如何用 Redis 做实时订阅推送的?

    作者:浮云骑士LIN 链接:https://www.cnblogs.com/linlinismine/p/9214299.html 前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落 ...

  9. 领券中心项目,我是如何用 Redis 做实时订阅推送的?

    作者:浮云骑士LIN 出处:cnblogs.com/linlinismine/p/9214299.html 前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下领劵中心 ...

最新文章

  1. 吴恩达等ML大神对话:如何用机器学习应对气候变化 | NeurIPS 2019
  2. rocketmq单机搭建
  3. HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之全然具体解释
  4. C语言试题九之s=(ln(1)+ln(2)+ln(3)+…+ln(m))^0.5,s作为函数值返回
  5. 随想录(在x86 linux上仿真多核cpu运行)
  6. OSChina 周五乱弹 —— 你用学习机来搞学习?
  7. angular 实现modal windows效果(即模态窗口,半透明的遮罩层),以及bootstrap(css,components,js)的初步学习...
  8. python 获取唯一值_从Python列表中获取唯一值
  9. 首张牌照花落“东方购物” 或抬高电视购物门槛
  10. 数据库中,什么是事务,事务的特性
  11. 常见的Java编程思想有哪些
  12. 完整版本的 poj 题目分类 转载
  13. vue提示音_VueJS 实现管理后台新订单的语音提醒
  14. html水晶按钮图片,20个纯CSS3实现的彩色透明水晶按钮
  15. mysql 章节作业题
  16. 关于 TRTC (实时音视频通话模式)在我司的实践
  17. Android Hybrid开发实战之图片的交互
  18. HTTP 、HTTPS
  19. 国务院发文,完善身份认证、电子印章等应用,加强数字政府建设
  20. 自定义彩色进度条效果

热门文章

  1. 02.14 Lizards and Basements 2
  2. 解决Eclipse里Tomcat突然启动失败
  3. 姚明的“内蒙古时间”:现身2019年WCBA全明星周末赛现场
  4. 国庆节到了 祝福祖国
  5. AS3933国产替代SI3933 125kPKE车钥匙方案
  6. 国际顶级域名后缀含义大全
  7. __builtin_expect用法
  8. 聊聊2021秋招互联网薪资
  9. HDMI,VGA,DVI,DP,MINI DP,AV等影音设备接口规参数
  10. 我国租赁情况分析,租赁一房一厅的人群最多,占比为35.8%