这里只是列举了一下如何实现和基础原理

Redis:二进制安全存储

优势:速度快、省空间

统计用户登录天数

基础原理

用SETBIT创建一个key1并赋值

SETBIT  key1  0  1
SETBIT key1 3 1
SETBIT key1 8 1
SETBIT key1 15 1
STRLEN key1

用Redis位图实现统计用户登录天数和活跃用户_赋值

用BITCOUNT统计key1中1出现的次数

BITCOUNT  key1 0  0
BITCOUNT key1 0 1
BITCOUNT key1 1 1

用Redis位图实现统计用户登录天数和活跃用户_赋值_02

实现:

可以将每一个key作为一个用户,然后每一个二进制位作为日期,用户登录时将对应日期的二进制位设置为1;如key1的二进制为:

10010000 10000001

则代表key1在第1、4、9、16天的时候有登录

BITCOUNT key1 0 0 结果为2则说明在1到8天的时候,key1的登录次数为2次;其他的以此类推。

(如果需要统计2到7天,可以先统计出1到8天的结果,然后再扣除第1天和第8天的结果;以及其他场景时,可根据具体的需求进行扣减或添加。)

统计活跃用户

基础原理

用SETBIT创建一个day1、day2并赋值

SETBIT  day1  0  1
SETBIT day1 3 1
SETBIT day2 2 1
SETBIT day2 3 1

用Redis位图实现统计用户登录天数和活跃用户_基础原理_03

用BITOP将day1、day2进行或运算,将结果赋值给day,查询day中1出现的次数

BITOP  or day day1 day2 
STRLEN day
BITCOUNT day 0 -1

用Redis位图实现统计用户登录天数和活跃用户_基础原理_04

day1、day2、day的二进制为:

day1 10010000

day2 00110000

day 10110000

实现:

可以将每一个key作为日期,然后每一个二进制位对应一个用户,当天用户登录时将对应的二进制位设置为1;如:

day1表示0和3对应的用户当天有登录,

day2表示2和3对应的用户当天有登录,

day表示在day1到day2期间0、2、3对应的用户有登录,即活跃用户。

其他扩展场景同上面依次类推。