最近面试过程中有很多面试官问道了redis,我们都知道redis的基本数据类型有string,hash,list,set,zset,这5个只是最常用的,至少还有2个数据类型Setbit(位操作),GEO(地理位置信息)等等。>5.0还有stream流类型,这个不是今天的重点。今天咱们的重点是基于redis的Setbit实现活跃用户统计功能。
我们来看一个实例吧
场景: 1亿个用户,每个用户登陆/做任意操作,记为 今天活跃,否则记为不活跃。
每周评出: 有奖活跃用户: 连续7天活动
每月评,等等...
其实简单说就是统计一下连续7天(或者连续30天)有多少人连续登陆过
咱们先来想一想传统的方案
很容易就会想到只要用户登陆了,我在表中插入一条数据,并且记录上对应的日期,然后用mysql里面的记录来逐个判断,类似于这样:
Userid date active
1 2020-07-27 1
1 2020-07-26 1
2 2020-07-27 1
...
但这样是存在一些问题的,主要的问题在于用户量高达1亿,每个用户登陆一次就远远的超过mysql的极限了,更不要说统计一星期了,而且用上group ,sum运算,计算也是非常慢的。所以在这种用户量大,而且统计比较简单的问题上,咱们可以运用位(setbit)操作来解决问题。
先分析一下思路,对于某一天来说,我们可以把这一天想像成一根小木棍,分成了不同的段落,每个段落对应的就是用户的位(因为有user_id),默认值都是0,只要有人登陆了,就把对应的用户