在实际工作中,我们经常可能会涉及到一些数据的统计,例如还是微博的使用场景,假设现在需要统计下这个月的微博用户的日活,也就是需要统计下最近一个月有哪些用户登录过微博,这样的场景我们怎么办呢?
可能一些小伙伴说我们把用户登录信息做一下登录日志,用户登陆过就更新下登录时间,到时候根据登录时间查询查询即可。
这个是不错,但是转换一下,我们需要统计下用户这个月在哪些日期登陆过微博呢?
可能一些小伙伴数我们把用户登录的信息单独找一张表来记录下,这时候用户的每次登录都有记录,想怎么查就怎么查。
这个是不错,但是想象一下,微博目前的日活都是在千万/亿级别,这样子每天得记录多少数据,这对于数据存储和查询成本来说得多大啊。最重要的还有查询的时候还需要进行去重处理。
对于这样的场景来说,我们可以怎么办呢?这就是今天给大家介绍的redis里面的二值状态统计,也就是合理的利用redis里面的Bitmap这个数据类型来实现。
在redis中Bitmap底层是使用string类型实现的,但是我们可以把它看错是一个bit数组。如果我们利用Bitmap来实现的话,那么用户登录之后,我们把登录事件设置为1,这样子一个用户1年的登录数据也只有个bit位,数据量是不是大大的减少。
那么我们怎么做呢?下面我们介绍下详细的流程
1)设计数据结构
这里的话,我们是统计的每个月用户的登录情况,所以我们的key可以以月份为主体,形式可以是这样子:userid:1:202307
2)插入记录
假设今天是7月6号,用户userid为1的用户登录了一次,此时我们向redis中插入数据:
setbit userid:1:202307 5 1
介绍下这里的含义,整个setbit的语法是:
setbit ${key} ${offset} ${value}
这里的offset是下标,我们知道数组的下标是从0开始的,这里的bit也是从0开始的,今天是6号,所以下标我们插入5即可。
3)验证下用户是否登录
这里我们在上面插入了userid为1的用户登录的数据,我们验证下用户7月6号是否有登陆过
getbit userid:1:202307 5
可以看到这个用户是登录过的。
那我们验证下用户7月5日是否登录过
getbit userid:1:202307 4
可以看到这里查询7月5号返回的是0,说明用户没有登陆过。
4)查询下用户7月份登陆过几次
这里我们多添加几条登陆演示数据
然后这里统计的话,主要使用的方法是bitcount,这里我们统计下用户7月份登陆过几次
bitcount userid:1:202307
可以看到统计出来的数据是3次,和整个过程能核对一致。
以上就是合理的利用redis里面的扩展数据类型Bitmap数据结构完成的二值状态查询/的案例。
备注:
1、使用bitmap数据类型可以实现占用很小的内存,存储大量的数据信息。只不过需要在思维上转换一下。
还没有评论,来说两句吧...