前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这样子签到好像比较舒服

这样子签到好像比较舒服

作者头像
灬沙师弟
发布2023-03-07 09:58:49
2690
发布2023-03-07 09:58:49
举报
文章被收录于专栏:Java面试教程Java面试教程

前言:

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

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

本文参与?腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-30,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 Java面试教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 正文:
  • 结语:
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com