这样子签到好像比较舒服

2023-03-07 09:58:49 浏览数 (2)

前言:

大家好,我是小面~今天给大家带来的主题是:

每当我们进入各种网页或者是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实现简单的签到功能,你会了吗?

0 人点赞