这样子签到好像比较舒服

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 这样子签到好像比较舒服

前言:

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

每当我们进入各种网页或者是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

根据我们要求实现签到功能,我们的命令如下:
(假设我们按周统计,今天用户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

我们可以用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来统计该用户一共签到了几天

BITCOUNT WEEK:CHECK:USERID:1 (返回4,代表一共签到了4天)

做到这里,大家也就知道咱们基本的签到功能就可以实现了~ 是不是很简单呀

此外既然已经和大家介绍了三个bitmap的命令,那就顺便把其他命令也给大家讲述一下吧~

BITPOS BITPOS key bit [start [end]]

这个命令的意思就是返回字符串中,从左到右,第一个比特值为bit(0或1)的偏移量 (以我们刚刚的签到记录为例子)

BITPOS WEEK:CHECK:USERID:1 1  (返回0)
BITPOS WEEK:CHECK:USERID:1 0  (返回3)

BITTOP BITOP operation destkey key [key ...]

这个命令就是对多个字符串进行操作(AND 逻辑与、OR逻辑或、XOR求异或 或者 NOT 逻辑非)

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实现简单的签到功能,你会了吗?

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
14天前
|
Python
【分享代码】国庆氛围不能少,快来给头像加个国旗
【分享代码】国庆氛围不能少,快来给头像加个国旗
25 0
【机房重构】—上机&订餐
当用户(我)发出一个订餐(排骨盖饭)指令,它就会通过我们的网络(通道)到达餐馆(DAL层),餐馆通过判断告诉我是否还有排骨盖饭(在机房收费系统中这就相当于判断卡号是否存在);
【机房重构】—上机&订餐
|
20天前
|
开发者
如何在游戏中实现一个好看的金币效果
如何在游戏中实现一个好看的金币效果
38 1
|
20天前
|
存储
PAT甲级真题1006:签到与签出
PAT甲级真题1006:签到与签出
27 0
|
9月前
温暖的签到题
Naruto可以负责任的告诉你,这是第一道温暖的签到题。 2020年新冠肺炎来势汹汹,娱乐场所都停业等待开业,现在某电影院提出了如下开业方案: 两个人不能坐在相邻的位置上(即两个人之间至少要隔一个座位),现在有一排横向排列的座位,电影院的负责人想知道,这一排最多能坐多少人?
78 3
|
11月前
|
小程序
微信小程序项目实例——食堂吃哪个
微信小程序项目实例——食堂吃哪个
|
Windows
一个改版的猜数字游戏,超搞笑
一个改版的猜数字游戏,超搞笑
140 0
一个改版的猜数字游戏,超搞笑
|
存储 数据处理
签到(CocosCreator)
签到(CocosCreator)
签到(CocosCreator)
|
Java
简单代码画红包和写祝福
简单代码画红包和写祝福
122 0
|
前端开发 Java 关系型数据库
假期第二天,给学弟写一个基于SSM框架图书馆预约占座系统
图书馆是学校信息化的重要场所,是科学研究的中心、图书中心、文献中心,高校的三大支柱之一。占座行为一直是图书馆管理的“心病”,乱占图书馆座位现象严重影响图书馆的管理。 为保证图书馆自习室座位与日益多的学生对于自习室座位的需求,对此需求开发出图书馆预约占座管理系统,本文解决了乱占座所导致的座位利用率不足的问题。
160 0
假期第二天,给学弟写一个基于SSM框架图书馆预约占座系统

热门文章

最新文章