点评项目——用户签到模块

2023.12.13

        通常app为了吸引用户每天登陆app,会设定一个签到模块,本章就来实现用户签到模块,包含签到功能和签到统计功能。

BitMap用法

        通常使用二进制位来记录每个月的签到情况,签到记录为1,未签到记录为0。每一个bit位对应当月的每一天,形成映射关系,用0和1标识业务状态,这种思路就成为位图(BitMap)。这样我们就能用极小的空间,来实现大量数据的表示。

        BitMap常见的操作命令有:

  • SETBIT:向指定位置(offset)存入一个0或1
  • GETBIT:获取指定位置(offset)的bit值
  • BITCOUNT:统计BitMap中值为1的bit位的数量
  • BITFIELD:操作(查询、修改、自增)BitMap中bit数组中的指定位置(offset)的值
  • BITFIELD_RO:获取BitMap中bit数组,并以十进制形式返回
  • BITOP:将多个BitMap的结果做位运算(与、或、异或)
  • BITPOS:查找bit数组中指定范围内第一个0或1出现的位置

签到功能

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

        为什么没有请求参数? Redis中是利用String类型数据结构实现BitMap,key值我们可以使用用户的id和当前的年月进行拼接,这样同一个用户同一个月的签到记录就会存储在同一个数据结构中,也方便统计单月签到次数,value值就是一串二进制值,不过为了可读性好会将二进制值转为十进制值。  所以这里我们需要的参数就是用户的id和当前的时间,这两个参数都可以直接获取,不需要传过来。  

        下面编写签到功能的实现类代码:

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

        使用postman模拟签到,注意请求头中需携带登录用户的token:

        查看redis数据,今天是12月13号南京大屠杀死难者国家公祭日,愿逝者安息。所以我们签到的日子是12月的第13天,会使用2字节(16bit)保存,倒数第三个数字为1,代表第13天签到了。

签到统计功能

        下面来实现统计截止当前时间用户在本月的连续签到天数,即从最后一次签到开始向前统计,直到遇到第一次未签到为止,计算总的签到次数,就是连续签到天数。 

        首先我们应该先得到截止今天为止所有的签到数据,可以使用BITFIELD来获取本月第一天到今天的所有签到数据。然后从后向前遍历每个bit位,如果签到了就让计数器+1,未签到就break退出循环。

        下面实现代码:

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

        先看看当前redis中的签到数据:

        即连续签到了三天,再用postman测试一下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MacOS环境配置一系列问题的汇总,方便以后自己查看

环境配置一系列问题的汇总&#xff0c;方便以后自己查看 man brew报错“No manual entry for brew” 解决方法记录&#xff1a; 解决问题之前尝试的方法&#xff1a; Linking manuals from Homebrew1 https://apple.stackexchange.com/questions/111061/linking-manuals-f…

2000-2022年上市公司数字化转型数据(年报词频、文本统计)

2000-2022年上市公司数字化转型数据&#xff08;年报词频、文本统计&#xff09; 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;上市公司年报、巨潮资讯网 3、方法说明&#xff1a;参考管理世界中吴非&#xff08;2021&#xff09;的做法&#xff0c;对人工智能技术、…

做题总结 19. 删除链表的倒数第 N 个结点(快慢指针思想)

19. 删除链表的倒数第 N 个结点 最初的想法进阶实现&#xff08;Java&#xff09; 最初的想法 计算出链表中的节点总数&#xff0c;然后遍历找到目标节点并删除。 class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode cur head;int count0;w…

Ubuntu 设置共享文件夹

一、在Windows中建立一个英文的文件夹 注意&#xff1a;新建文件夹的名称一定要是英文的&#xff0c;不能出现中文的路径&#xff08;可能出现问题&#xff09; 二、在VMware中添加共享文件 3: VMware安装VMware Tools 一般安装成功桌面上会显示这个安装包&#xff0c;&…

大型软件编程实际应用实例:个体诊所电子处方系统,使用配方模板功能输入症状就可开出处方软件操作教程

一、前言&#xff1a; 在开电子处方的时候&#xff0c;如果能够输入症状就可以一键导入配方&#xff0c;则在很大程度上可以节省很多时间。而且这个配方可以根据自己的经验自己设置&#xff0c;下面以 佳易王诊所电子处方软件为例说明。 二、具体一键导入配方详细操作教程 点击…

学习Java第68天,MVC架构模式理论简介

一.MVC架构模式 MVC&#xff08;Model View Controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;它把软件系统分为模型、视图和控制器三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c;在改…

01java语言基础

一、初始计算机和Java语言 1、计算机的体系结构 a.计算机的基本概念 计算机(Computer)俗称电脑&#xff0c;是现代一种用于高级计算&#xff0c;使用非常广泛 的设备&#xff0c;主要由计算机硬件和计算机软件两个部分组成。 • 计算机硬件是客观存在的各种计算机相关设备&a…

提升工作效率,尽在Microsoft Office LTSC 2021 for Mac!

在当今的办公环境中&#xff0c;高效率的工作是每个人都追求的目标。作为全球领先的办公软件套装&#xff0c;Microsoft Office LTSC 2021 for Mac将为您提供一站式的解决方案&#xff0c;帮助您轻松应对各种工作任务。 首先&#xff0c;Microsoft Office LTSC 2021 for Mac拥…

C# 通俗讲解Public、Private以及Protected、[HideInInspector]、[SerializeField]的区别

一、故事背景 1.我画了一幅画&#xff0c;把它放在室外&#xff0c;所有人都可以看见这个画&#xff0c;所有人都可以对这个画进行修改。 2.我非常非常努力&#xff0c;赚了一大笔钱&#xff0c;这笔钱&#xff0c;只能我和我的子孙后代用&#xff0c;但如果我的孩子需要传给他…

jmap命令的实现原理解析

jmap可以做什么&#xff1f; 1、jmap -histo[:live] 通过histo选项&#xff0c;打印当前java堆中各个对象的数量、大小。 如果添加了live&#xff0c;只会打印活跃的对象。 2、jmap -dump:[live,]formatb,file 通过-dump选项&#xff0c;把java堆中的对象dump到本地文件&a…

leaflet使用热力图报L找不到的问题ReferenceError: L is not defined at leaflet-heat.js:11:3

1.在main.js中直接引入会显示找不到L 2.解决办法 直接在组件中单独引入使用 可以直接显示出来。 至于为什么main中不能引入为全局&#xff0c;我是没找到&#xff0c;我的另外一个项目可以&#xff0c;新项目不行&#xff0c;不知哪里设置的问题

【小聆送书第二期】人工智能时代AIGC重塑教育

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;正文&#x1f4dd;活动参与规则 参与活动方式文末详见。 &#x1f4cb;正文 AI正迅猛地…

【技巧】导出和导入Typecho的文章数据

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景介绍 1、要换服务器了&#xff0c;虽然Typecho和Theme都可以重装&#xff0c;但文章数据由于是存在数据库里的&#xff0c;所以需要额外一些操作才行。 2、在进行下面的数据导入导出之前&#xff0c;新服务器…

GitHub Copilot - Elasticsearch 和 MySQL 单表查询耗时比对

当单表数据库超过百万后&#xff0c;数据库 like %xxx% 查询明显变慢&#xff0c;为了对比 Elasticsearch 的效果&#xff0c;将百万级的测试数据导入到 Elasticsearch 中对比看看效果。导入和查询 Elasticsearch 的过程完全通过 GitHub Copilot Chat 辅助编码。 Elasticsearc…

3.0 kVrms电压隔离: ADUM162N0BRZ、ADUM163N1BRZ、ADUM1281CRZ、ADUM1285CRZ通用多通道隔离(数字隔离器)

一、ADUM162N、ADuM163N 集成故障安全和2、3个反向通道的鲁棒3.0 kV rms六通道数字隔离器 ADuM162N / ADuM163N 均为采用ADI公司iCoupler技术的6通道数字隔离器。这些隔离器件将高速、互补金属氧化物半导体(CMOS)与单芯片空芯变压器技术融为一体&#xff0c;具有优于光耦合器件…

源代码泄密困扰企业?上海迅软DSE助力解决问题

源代码是软件开发最重要的资源&#xff0c;同时也是开发人员思想、经验和工作的结晶。对于软件开发企业来说&#xff0c;实施有效的源代码防泄密措施至关重要&#xff0c;因为源代码文档和程序文档都具有极高的商业价值&#xff0c;属于企业的商业机密。 为了确保企业的源代码…

Java_Mybatis_缓存

缓存 1.概述 Mybatis 缓存&#xff1a;MyBatis 内置了一个强大的事务性查询缓存机制&#xff0c;它可以非常方便地配置和定制 2.会话缓存&#xff08;一级缓存&#xff09; sqlSession 级别的&#xff0c;也就是说&#xff0c;使用同一个 sqlSession 查询同一 sql 时&#x…

YOLOv7独家原创改进:SPPF自研创新 | SPPF创新结构,重新设计全局平均池化层和全局最大池化层,增强全局视角信息和不同尺度大小的特征

💡💡💡本文原创自研创新改进:SPPF_improve利用全局平均池化层和全局最大池化层,加入一些全局背景信息和边缘信息,从而获取全局视角信息并减轻不同尺度大小所带来的影响 强烈推荐,适合直接使用,paper创新基本 💡💡💡 在多个数据集验证涨点,尤其对存在多个尺…

大模型的研究新方向:混合专家模型(MoE)

大模型的发展已经到了一个瓶颈期&#xff0c;包括被业内所诟病的罔顾事实而产生的“幻觉”问题、深层次的逻辑理解能力、数学推理能力等&#xff0c;想要解决这些问题就不得不继续增加模型的复杂度。随着不同应用场景的实际需求&#xff0c;大模型的参数会变得越来越大&#xf…

npm安装,idea中启动vue失败

node 设置配置之后&#xff0c;要查询时&#xff0c;会从.npmrc中读取路径 .npmrc自己创建的&#xff08;默认情况下.npmrc会创建在C盘中&#xff09; 我创建的在D:\studay-and-working\node16.14\node_modules\npm中 指定.npmrc文件&#xff0c;因为默认会访问C盘的.npmrc文件…