【Redis】BitMap数据类型与用户签到功能的实现

news/2024/11/29 4:32:59/

目录

一、BitMap

1、概念

2、命令

1.SETBIT

2.GETBIT

3.BITCOUNT

4.BITFIELD

5.BITFIELD RO

6.BITOP

7.BITPOS

二、用户签到

1、思路

2、代码实现

三、当前时间的连续签到天数

1、思路

2、代码实现


一、BitMap

1、概念

Redis中通过String类型实现的一种数据类型,因此存储上限是512M,转换为bit则是2^32个比特位,每一位存储0或1

2、命令

1.SETBIT

向指定key的指定位置中存入0或1

2.GETBIT

获取指定key指定位置的值

3.BITCOUNT

计算指定key中值为1的bit位数量

4.BITFIELD

查询、修改、自增指定key指定位置的值

5.BITFIELD RO

获取指定key中的bit数组,以十进制形式返回

6.BITOP

将多个指定key的结果做位运算

7.BITPOS

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

二、用户签到

1、思路

一个月最多有31天,而bitMap有31位,我们可以将当前签到用户的id与当前时间年份+月份作为key,以BitMap为数据结构进行存储用户该月是否签到每一位表示一天,0与1表示是否签到,当用户点击签到请求时,服务器获取当前的时间与当前签到用户的id,以id+当前年月时间作为key,将当前的日作为下标,在BitMap中指定下标位存储1,比如当前签到用户是张三id=1,则key= “sign:1:2020-01”作为key,今天是1月11,则将这个key的第11位的也就是10下标的值修改为1即可表示签到

2、代码实现

void test() {// 1.获取当前用户idLong userId = 1L;// 2.获取当前时间LocalDateTime now = LocalDateTime.now();// 2.1 获取年月String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));// 2.2 获取日int day = now.getDayOfMonth();// 3.存入redis// 3.1 构造keyString key = "sign:" + userId + keySuffix;// 3.2 存入stringRedisTemplate.opsForValue().setBit(key,day - 1,true);}

三、当前时间的连续签到天数

1、思路

当前时间的连续签到天数一定是从现在开始往前数,直到遇到没有签到的那天则结束计算,我们只需要获取到当前用户当前时间对应的bitMap中的每一个比特位,然后从后往前数1当数到0时则停止,最后返回数量即可,我们可以通过BITFIELD RO命令以十进制形式获取到数据,然后按位与1后,如果结果是1则计算变量++后无符合右移1位继续按位与1,直到按位与1等于0时停止。

比如 5 他的二进制是101,从后往前计算他的1的连续个数,101先进行101&1 = 1则计数器+1为1,此时101>>>1  变为10,此时10&1 = 0结束循环计数器值为1,说明从后往前连续的1只有1个

2、代码实现

Integer test() {// 1.获取用户idLong userId = 1L;// 2.获取当前时间LocalDateTime now = LocalDateTime.now();String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));int day = now.getDayOfMonth();// 3.获取对应的签到数值String key = "sign:" + userId + keySuffix;List<Long> result = stringRedisTemplate.opsForValue().bitField(key, BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(day)).valueAt(0));if (result == null || result.isEmpty()) {return null;}// 4.开始计数Long num = result.get(0);if (num == null || num == 0) return null;int count = 0;while (true) {if ((num & 1) == 1) {count++;} else {break;}num >>>= 1;}// 5.返回return count;}


http://www.ppmy.cn/news/135883.html

相关文章

微软所有正版软件下载网站ITELLYOU

上周上课&#xff0c;从一个学生得知这样一个神奇的网站&#xff0c;汇集了微软出品的几乎所有软件&#xff0c;提供下载。 这是网站的主页&#xff0c;简简单单&#xff0c;就是一个分类。 里面的操作系统栏目&#xff0c;涵盖了DOS6到最新的Windows8.1 with update&#xff1…

Mac软件下载站推荐,让你告别软件荒!

有很多新人小白在买了MacBook之后可能才会知道&#xff0c;MacBook上很多软件都是收费的。 并且还找不到下载资源。 很多软件在 App Store 内并未上架&#xff0c;也找不到软件官网&#xff0c;不知道如何下载。 遇到这种情况&#xff0c;我们就可以尝试从一些第三方网站下载资…

java通用软件下载网址_一些常用软件下载网址(分享)

Tomcat 服务器的下载 http://tomcat.apache.org/ 建议下载压缩包版本(文件名是apache-tomcat-6.0.14.zip)&#xff0c;而不是Windows Service Installer 的EXE 安装文件. Eclipse 3.3 分出了几个类型的下载包&#xff0c;第一个是普通的Java开发包&#xff0c;我们下载它就可以…

无意中发现软件下载网站 softonic

Softonic 于1997年成立于西班牙&#xff0c;是欧洲领先的软件下载网站。目前&#xff0c;Softonic 在全球范围内已建立多个国家站点&#xff0c;包括西班牙、美国、英国、德国、法国、意大利、巴西、 中国、波兰&#xff0c;收录各类 免费软件(freeware)、共享软件(shareware)…

破解软件下载网站100个

破解软件下载网站100个□xuly 发表于 2005-11-24 7:48:00 &#xff08;1&#xff09;无忧软件网 - 不可多得的破解软件下载基地,附有无忧书库,无忧字体,代码基地,无忧教学,免费园地,完全游戏? http://www.51soft.com/ 2{KPE&#xff08;2&#xff09;精品软件秀 - 软件下载网页…

[转] 国内软件破解下载网站列表!

[转] 国内软件破解下载网站列表! Posted on 2005-04-25 11:17 Laser.NET 阅读(872) 评论(1) 编辑 收藏 国内最有信誉的破解下载网站,总能让你有意外收获。 18DD资源中心:http://www.18dd.com 7年:http://www.7year.com/ 热战软件园:http://soft.rezhan.com wqsky:http…

base.apk软件下载免费_PS软件各版本免费下载地址

你好,我是谢振! 直接电脑里访问以下网址: 这里我汇聚了PSCS6、PSCC、PSCC2015、PSCC2018、PSCC2019、PSCC2020版本,以及你PS安装过程中可能导致失败的所有问题。 PS软件各版本免费下载地址: http://www.duoduoxuexi.com/a/psjc/psrj/ 复制以上链接到浏览器地址栏里打开,建…

吐血分享9个软件下载网站以及那些开发者大佬的传奇人生

文章目录 1.大眼仔&#xff08;http://dayanzai.me/?yevsvyg6qhe&#xff09;2.胡萝卜周&#xff08;http://www.carrotchou.blog/&#xff09;3.果核剥壳&#xff08;https://www.ghpym.com/&#xff09;4.微PE工具箱(http://www.wepe.com.cn/download.html)5.微软软件下载&a…