常用方法三种

一、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。

还有没有占存储空间更少的办法?

三、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统计用户日活量_使用redis统计用户日活、月活(实践版)相关推荐

  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. 玩转Redis-HyperLogLog统计微博日活月活

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

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

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

  7. redis实现轮询算法_用redis实现支持优先级的消息队列

    为什么需要消息队列 系统中引入消息队列机制是对系统一个非常大的改善.例如一个web系统中,用户做了某项操作后需要发送邮件通知到用户邮箱中.你可以使用同步方式让用户等待邮件发送完成后反馈给用户,但是这样 ...

  8. redis 缓存过期默认时间_过期redis时间

    Redis命令--键(key) Redis 键(key) Redis 键命令用于管理 redis 的键. 语法 Redis 键命令的基本语法如下: redis 127.0.0.1:6379> C ...

  9. redis分布式锁java代码_基于redis实现分布式锁

    " 在上一篇文章中介绍了动态配置定时任务,其中的原理跟spring 定时任务注解@Scheduled一样的,都是通过线程池和定义执行时间来控制.来思考一个问题,如果我们的定时任务在分布式微服 ...

最新文章

  1. TweetBot TabBar
  2. 召回:是塔,是塔,但不是双塔!
  3. 8.21 :odd??:nth-of-type??
  4. IIS 7.5 URL重写参数
  5. 在JavaScript中使用JSON
  6. 密码生成的思路---电脑mac地址
  7. 提高性能及操作硬件的能力
  8. [BZOJ 1799] self 同类分布
  9. javascript 实现下载的几种方法
  10. 关掉magiskhide_[讨论] Magisk隐藏root的实现
  11. 580刷590bios_身价瞬间涨几百 RX 480刷bios变身RX 580
  12. SCI 论文过去时和现在时 时态的使用
  13. 彗星通行证的积分规则是什么?
  14. 如何用计算机弹出斗地主的声音,玩斗地主没声音电脑瞎出牌。我点的没有.怎么办?...
  15. 免费图片素材网站收集
  16. 激光雷达:905与1550的战争
  17. blender2.8 使用教程 贴图纹理快捷键等。
  18. 记录win10安装Dexdump并脱壳
  19. overflow的overlay属性值
  20. 电源地与信号地关系的详细解析

热门文章

  1. MindManager:将excel转成思维导图
  2. pyspark系列--统计基础
  3. Photoshop教程8000例。平时想做的各种效果完整郎阔!
  4. c语言自动随机发牌给四个人(没有大小王)
  5. AI耳机要想“复制”智能音箱的爆红,还要迈过哪些坎?
  6. js实现图片裁剪效果
  7. js检查违禁词汇敏感词汇代码
  8. Appium移动自动化测试(三)--安装Android模拟器(建议直接连手机,跳过此步)
  9. 到底什么是STN技术?
  10. Halcon 算子 circularity