黑马点评--用户签到
创始人
2024-03-01 14:55:55

用户签到

  • BitMap用法
  • 签到功能
  • 签到统计

BitMap用法:

我们按月来统计用户签到信息,签到记录为1,未签到则记录为0.(布隆过滤器就是采用这种结构)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RsaZg9D6-1669736765619)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221129181234928.png)]

把每一个bit位对应当月的每一天,形成了映射关系。用0和1标示业务状态,这种思路就称为位图(BitMap)。

Redis是利用string类型数据结构实现BitMap,因此最大上限512M,转换为bit则是2^32个bit位。

BitMap的操作命令有:‘

SETBIT:向指定位置(offset)存入一个0或1

GETBIT:获取指定位置(offset)的bit值

BITCOUNT:统计BitMap中值为1的bit位

BITFIELD:操作(查询,修改,自增)BitMap中bit数组中的指定位置(offset)的值

BITFIELD_RD:获取BitMap中bit数组,并以十进制形式返回

BITOP:将多个BitMap的结果做位运算(与,或,异或)

BITPOS:查找bit数组中指定范围内第一个0或1出现的位置

签到功能

需求:实现签到接口,将当前用户当天签到信息保存到Redis中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9vsPG5i8-1669736765621)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221129212906306.png)]

提示:因为BitMap底层是基于String数据结构,因此其操作也都封装在字符串相关操作中了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q0TxiynJ-1669736765622)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221129213015824.png)]

代码实现

  public Result sign() {//1.获取当前登录的用户Long userId = UserHolder.getUser().getId();//2.获取日期LocalDateTime now = LocalDateTime.now();//3.拼接keyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyy-MM"));String key=USER_SIGN_KEY+userId+keySuffix;//4.获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();//5.写入Redis SETBIT key offset 1stringRedisTemplate.opsForValue().setBit(key,dayOfMonth-1,true);return Result.ok();}

统计连续签到

什么叫连续签到天数?

从最后一次签到开始向前统计,直到遇到第一次未签到为止,计算总的签到次数,就是连续签到天数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BTQliNoL-1669736765623)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221129225245656.png)]

如何得到本月到今天为止的所有签到数据?

BITFELD key GET u[dayOfMonth]0

如何从后向前遍历每一个bit位?

与1做运算,就能得到最后一个bit位

随后右移1位,下一个bit为就成为最后一个bit为。

代码实现:

public Result signCount() {//1.获取当前登录的用户Long userId = UserHolder.getUser().getId();//2.获取日期LocalDateTime now = LocalDateTime.now();//3.拼接keyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyy-MM"));String key=USER_SIGN_KEY+userId+keySuffix;//4.获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();//5.获取本月截止今天为止的所有的签到记录,返回的是一个十进制的数字List result = stringRedisTemplate.opsForValue().bitField(key, BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0));if (result == null || result.isEmpty()){//没有任何签到结果return Result.ok(0);}Long num =result.get(0);if (num == null || num==0){return Result.ok();}//6.循环遍历int count=0;while (true) {//6.1让这个数字与1做与运算,得到数字的最后一个bit位//判断这个bit是否为0if ((num & 1) == 0){//如果为0,说明未签到,结束break;}//如果不为0,说明已签到,计数器+1count++;//把数字右移一位,抛弃最后一个bit位,继续下一个bit位num=num >>1;}return Result.ok(count);}

相关内容

热门资讯

demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...