【赵强老师】Redis案例分析:用setbit统计活跃用户

1、需求背景

首先,咱们来看一下需求:网站统计用户登陆的次数,具体以下:redis

  • 网站有1亿个用户,有常常登陆的,也有不常常登陆的
  • 如何来记录用户的登陆信息
  • 如何查询活跃用户:好比:一周内,登陆3次的

2、使用传统的关系型数据库

咱们使用传统的关系型数据库(好比:Oracle)来存储这样的数据,以下图所示。数据库

 每周产生7亿条数据,对于任何一个关系型数据库来讲,都是很是很差维护的,对性能也会有很大的影响。性能

3、使用Redis的setbit操做

Redis支持对String类型的value进行基于二进制位的置位操做。经过将一个用户的id对应value上的一位,经过对活跃用户对应的位进行置位,就可以用一个value记录全部活跃用户的信息。以下图所未,下图中的bitmap有9个位被置为1,表示这9个位上对应的用户是今天的活跃用户。其中第15位表示uid为15的用户,第一位表示uid为0的用户。(若是你的uid不是从1开始的,好比从100000开始,实际上你也能够相应的用uid减去初始值来表示其位数,好比1000000用户对应到bitmap的第一位)网站

具体的代码相似下面这样:
redis.setbit(key, user_id, 1)
这样一次记录的复杂度是O(1),在Redis中速度很是快。
下面代码是在Redis CLI中执行的Demo演示,好比:用户ID为100的用户在星期一登陆了网站,咱们就经过setbit操做,把星期一对应的100位的值置为1,
127.0.0.1:6379> setbit monday 100 1
(integer) 0
而咱们经过天天换用一个不一样的key来将天天的活跃用户状态记录分开存。而且能够经过一些与或运算计算出N天活跃用户,和链接N天活跃用户这样的统计数据。

以下图,第一行表示星期一的活跃用户状况,第二行表示周二的,以此类推。为样咱们经过对N天的活跃用户记录取并集操做,就能得出在N天内活跃过的用户列表。ui

相关文章
相关标签/搜索