上亿用户连续一周活跃用户数统计

本文介绍了如何使用Redis的Bitmap数据结构,通过位运算高效地统计一周内连续活跃用户数量。通过设置7个Bitmap分别对应一周的7天,并用位AND操作找出连续登录的用户,最后通过bitcount命令得出结果。这种方法只需要100MB内存,适用于处理大规模用户数据。
摘要由CSDN通过智能技术生成
需求: 上亿个用户,统计一周内连续活跃用户

100000000/8/1024/1024 = 11.9M 一个bitmap占用 不到12M

好在一周只有7天, 我们用7个key的bitmap来存储状态即可,

加上最后的一个结果res的bitmap: 12*8=100M 内存即可!

遵循下面步骤即可:

  1. 用户编号是前提, 每个用户的编号从1到n(n=就是说的那个上亿的最大值);
  2. 声明7个bitmap, 从周一到周日: mon tue wed thur fri sat sun;
  3. 每个用户编号所在的offset在周1如果登录了, 就是1, 没登录就是0;
  4. 7个bitmap都设值记录;
  5. bitop 对7个bitmap进行位AND操作, 7天都登录的当天的位上才是1
  6. 最后的结果进行bitcount操作, 就是上亿用户一周内连续活动的人数!
  7. 如果想知道连续活跃的用户都有哪些人, 遍历 getbit 每一天的key(mon/tue/...) id即可!

示例: 我们模拟5个用户吧:

用户IDmontuewedthurfrisatsun
0011111111
0020000011
0031111111
0041111111
0050101

2.2 前4步: 初始化7个bitmap

周一的key: mon, 周一所有用户的登录状态记录:

127.0.0.1:6379> setbit mon 1 1
(integer) 0
127.0.0.1:6379> setbit mon 2 0
(integer) 0
127.0.0.1:6379> setbit mon 3 1
(integer) 0
127.0.0.1:6379> setbit mon 4 1
(integer) 0
127.0.0.1:6379> setbit mon 5 0
(integer) 0

周二的key: tue, 所有用户的登录状态记录:

127.0.0.1:6379> setbit tue 1 1
(integer) 0
127.0.0.1:6379> setbit tue 2 0
(integer) 0
127.0.0.1:6379> setbit tue 3 1
(integer) 0
127.0.0.1:6379> setbit tue 4 1
(integer) 0
127.0.0.1:6379> setbit tue 5 1
(integer) 0

周三的key: wed, 所有用户的登录状态记录:

127.0.0.1:6379> setbit wed 1 1
(integer) 0
127.0.0.1:6379> setbit wed 2 0
(integer) 0
127.0.0.1:6379> setbit wed 3 1
(integer) 0
127.0.0.1:6379> setbit wed 4 1
(integer) 0
127.0.0.1:6379> setbit wed 5 0
(integer) 0

周四的key: thur, 所有用户的登录状态记录:

127.0.0.1:6379> setbit thur 1 1
(integer) 0
127.0.0.1:6379> setbit thur 2 0
(integer) 0
127.0.0.1:6379> setbit thur 3 1
(integer) 0
127.0.0.1:6379> setbit thur 4 1
(integer) 0
127.0.0.1:6379> setbit thur 5 1
(integer) 0

周五的key: fri, 所有用户的登录状态记录:

127.0.0.1:6379> setbit fri 1 1
(integer) 0
127.0.0.1:6379> setbit fri 2 0
(integer) 0
127.0.0.1:6379> setbit fri 3 1
(integer) 0
127.0.0.1:6379> setbit fri 4 1
(integer) 0
127.0.0.1:6379> setbit fri 5 0
(integer) 0

周六的key: sat, 所有用户的登录状态记录:

127.0.0.1:6379> setbit sat 1 1
(integer) 0
127.0.0.1:6379> setbit sat 2 1
(integer) 0
127.0.0.1:6379> setbit sat 3 1
(integer) 0
127.0.0.1:6379> setbit sat 4 1
(integer) 0
127.0.0.1:6379> setbit sat 5 1
(integer) 0

周日的key: sun, 所有用户的登录状态记录:

127.0.0.1:6379> setbit sun 1 1
(integer) 0
127.0.0.1:6379> setbit sun 2 1
(integer) 0
127.0.0.1:6379> setbit sun 3 1
(integer) 0
127.0.0.1:6379> setbit sun 4 1
(integer) 0
127.0.0.1:6379> setbit sun 5 1
(integer) 0

我去, 数据终于录入完了, 费劲那个~~

2.3 用bitop对7个bitmap进行位AND操作

127.0.0.1:6379> bitop and res mon tue wed thur fri sat sun
(integer) 1

2.4 bitcount对结果bitmap, 见证奇迹的时刻到了

127.0.0.1:6379> bitcount res
(integer) 3

2.5 想知道连续活跃的用户都有哪些人

getbit res 1 表示 用户编号为1的结果: 1说明用户ID=1的, 7天都活跃!

5个用户结果如下:

127.0.0.1:6379> getbit res 1
(integer) 1
127.0.0.1:6379> getbit res 2
(integer) 0
127.0.0.1:6379> getbit res 3
(integer) 1
127.0.0.1:6379> getbit res 4
(integer) 1
127.0.0.1:6379> getbit res 5
(integer) 0

2.6 扩展:

如果需求是: 求一周内活跃过的用户数: 只要将 上面命令中bitop and 改为: bitop or 即可~

连续 的话要求是AND, 活跃过 的话, 只要有一天就可以

over!

2.7 小结

bitmap的操作命令:

  • setbit key offset value
  • getbit key offset
  • bitcount key [start end]
  • bitop operation destkey [key ...]

    operation: 支持 AND/OR/NOT/XOR四种操作,除NOT 外,其他操作都可接受一个或多个 key 作输入

    destkey: 后面所有 key([key...])的与或非异或操作的结果存入一个目标key, 取个名字!

    key... 可以n个key做 与或非异或操作, 传入这些bitmap的key 列表

原文链接:https://segmentfault.com/a/1190000023704266

 

一、课程简介随着技术的飞速发展,经过多年的数据积累,各互联网公司已保存了海量的原始数据和各种业务数据,所以数据仓库技术是各大公司目前都需要着重发展投入的技术领域。数据仓库是面向分析的集成化数据环境,为企业所有决策制定过程,提供系统数据支持的战略集合。通过对数据仓库中数据的分析,可以帮助企业改进业务流程、控制成本、提高产品质量等。二、课程内容本次精心打造的数仓项目的课程,从项目架构的搭建,到数据采集模块的设计、数仓架构的设计、实战需求实现、即席查询的实现,我们针对国内目前广泛使用的Apache原生框架和CDH版本框架进行了分别介绍,Apache原生框架介绍中涉及到的技术框架包括Flume、Kafka、Sqoop、MySql、HDFS、Hive、Tez、Spark、Presto、Druid等,CDH版本框架讲解包括CM的安装部署、Hadoop、Zookeeper、Hive、Flume、Kafka、Oozie、Impala、HUE、Kudu、Spark的安装配置,透彻了解不同版本框架的区别联系,将大数据全生态系统前沿技术一网打尽。在过程中对大数据生态体系进行了系统的讲解,对实际企业数仓项目中可能涉及到的技术点都进行了深入的讲解和探讨。同时穿插了大量数仓基础理论知识,让你在掌握实战经验的同时能够打下坚实的理论基础。三、课程目标本课程以国内电商巨头实际业务应用场景为依托,对电商数仓的常见实战指标以及难点实战指标进行了详尽讲解,具体指标包括:每日、周、月活跃设备明细,留存用户比例,沉默用户、回流用户、流失用户统计,最近连续3周活跃用户统计,最近7天内连续3天活跃用户统计,GMV成交总额分析,转化率及漏斗分析,品牌复购率分析、订单表拉链表的设计等,让学生拥有更直观全面的实战经验。通过对本课程的学习,对数仓项目可以建立起清晰明确的概念,系统全面的掌握各项数仓项目技术,轻松应对各种数仓难题。四、课程亮点本课程结合国内多家企业实际项目经验,特别加入了项目架构模块,从集群规模的确定到框架版本选型以及服务器选型,手把手教你从零开始搭建大数据集群。并且总结大量项目实战中会遇到的问题,针对各个技术框架,均有调优实战经验,具体包括:常用Linux运维命令、Hadoop集群调优、Flume组件选型及性能优化、Kafka集群规模确认及关键参数调优。通过这部分学习,助学生迅速成长,获取前沿技术经验,从容解决实战问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值