前言:
大家好,我是小面~今天给大家带来的主题是:
每当我们进入各种网页或者是APP或者是游戏,里面都有一个耳熟能详的功能那就是签到功能。而用户也是很乐意去签到, 因为会送东西。签到功能同时也保证了用户的粘性,保持活跃量。今天小面就在这里用redis给大家实现一下简单的签到功能~
正文:
我们要实现签到功能用的结构是bitmap(位图)。小面在这里也讲一下,为什么要用redis的bitmap结构去做签到功能。
首先我们了解一下bitmap。bitmap,我们可以理解为他是一串二进制数组(由0,1)组成,可以通过偏移量来定位。他的优点之一就是它存储非常节省空间,特别适合一些数据量大且使用二进制统计的场景。回到我们的签到功能,如果一个用户比如今天签到了 ,那么我们就用1来表示该用户签到,一个月30天,那么该用户一个月的签到记录 也就只占用30bit。如果我们用mysql数据库去保存用户签到信息的话,那占的空间就很大了,一条数据包括了 userId,date,isCheck等等…… 这样一个月就是30条数据。。。相较于redis 的bitmap空间占用还是太大了。
我们来学习一下redis的bitmap的相关命令:
SETBIT: SETBIT key offset value
代码语言:javascript复制根据我们要求实现签到功能,我们的命令如下:
(假设我们按周统计,今天用户id为1的用户在这周的第一天签到)
SETBIT WEEK:CHECK:USERID:1 0 1
(这周的第二天签到)
SETBIT WEEK:CHECK:USERID:1 1 1
(这周的第三天签到)
SETBIT WEEK:CHECK:USERID:1 2 1
(后面三天天没签到)
(这周的第七天签到)
SETBIT WEEK:CHECK:USERID:1 6 1
此时的bitmap的存储内容是:【1,1,1,0,0,0,1】,中间三天是没有签到的。
GETBIT:GETBIT KEY OFFSET
代码语言:javascript复制我们可以用GETBIT命令去查询一下用户是否有签到记录:
GETBIT WEEK:CHECK:USERID:1 0 (返回1,就是签到过)
GETBIT WEEK:CHECK:USERID:1 3 (返回0,就是没签到过)
BITCOUNT BITCOUNT key [start end]
(这里的start 和 end 代表字节,一个字节=8个bit) 我们可以用BITCOUNT来统计该用户一共签到了几天
代码语言:javascript复制BITCOUNT WEEK:CHECK:USERID:1 (返回4,代表一共签到了4天)
做到这里,大家也就知道咱们基本的签到功能就可以实现了~ 是不是很简单呀
此外既然已经和大家介绍了三个bitmap的命令,那就顺便把其他命令也给大家讲述一下吧~
BITPOS BITPOS key bit [start [end]]
这个命令的意思就是返回字符串中,从左到右,第一个比特值为bit(0或1)的偏移量 (以我们刚刚的签到记录为例子)
代码语言:javascript复制BITPOS WEEK:CHECK:USERID:1 1 (返回0)
BITPOS WEEK:CHECK:USERID:1 0 (返回3)
BITTOP BITOP operation destkey key [key ...]
这个命令就是对多个字符串进行操作(AND 逻辑与、OR逻辑或、XOR求异或 或者 NOT 逻辑非)
代码语言:javascript复制set a "xff"
set b "x00"
bitop AND andkey a b (andkey:"x00")
bitop OR orkey a b (orkey:"xff")
bitop XOR xorkey a b (xorkey:"xff")
bitop not notkey a (notkey:"x00")
BITFIELD BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
BITFIELD可以对非同宽的比特位进行处理,对于任意偏移量的字段也可以进行处理。
结语:
这就是redis实现简单的签到功能,你会了吗?