常见场景题-Redis的bitmap如何实现签到功能?

Redis 的 bitmap 实现签到系统?

答:
主要讲一下 Redis 原生的 bitmap 的使用方法,以及如何使用 bitmap 来实现签到功能

先来看一下如何使用 redis bitmap 的原生命令实现签到功能:

  • 签到

我们先来设计 key:userid:yyyyMM,那么假如 usera 在2023年10月3日和2023年10月4日签到的话,使用以下命令:

setbit key offset value

在3日签到的话,偏移量应该设置为2,则签到之后为 001

在4日签到的话,偏移量应该设置为3,则3日、4日签到后为0011(第3位和第4位都是1,表示这两天签到了)

在31日签到的话,偏移量应该设置为30,表示向右偏移30位

127.0.0.1:6379> setbit userx:202310 2 1
(integer) 0
127.0.0.1:6379> setbit userx:202310 3 1
(integer) 0
127.0.0.1:6379> setbit userx:202310 30 1
(integer) 0
  • 查看2023年10月哪些天签到了,10月有31天,所以使用u31(31位无符号整数),后边偏移量为0
127.0.0.1:6379> bitfield userx:202310 get u31 0
1) (integer) 402653185

通过 bitfield [key] get u31 0 获取了31位的无符号整数,将该整数402653185转为二进制如下:(可以发现从左向右第4位和第5位位1,表示这两天签到了,也就是3号签到的时候,在setbit key value offset中,偏移量设置了为3,所以向右偏移3为,在第4位上)

402653185 十进制
0011000000000000000000000000001 二进制

通过取出来这个无符号整数,我们在代码中就可以通过位运算来判断某一天是否签到,可以看出,第3、4、31位都是1,表明在这三天都进行了签到

那么如果今天是10月26日,我们想知道10月1日-10月26日有哪些天进行签到,使用如下命令:

127.0.0.1:6379> bitfield userx:202310 get u26 0
1) (integer) 12582912

12582912 转为二进制为:

26位无符号整数:
00110000000000000000000000

那么我们在计算连续签到的次数就可以使用以下方法:

public Integer getContinuousSignCount() {/*假如今天是 10月26日假如通过 redis 的 bitfield userx:202310 get u26 0 命令得到了从1日-26日的签到数据为:12582912*/Long v = 12582912;// 这里 26 为今天的日期Integer signCount = 0;for (int i = 0; i < 26; i ++) {if (v & 1 == 0) return signCount;signCount ++;v >>= 1;}
}

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

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

相关文章

一文通关物理机Ubuntu22.04融合部署OpenStack

前言 因为博主笔记本是amd的&#xff0c;就最近搞了个小主机&#xff0c;就想装个云平台玩玩&#xff0c;搞了三四天才正儿八经弄完&#xff0c;摸了一大堆错误出来&#xff0c;在文章前面我会将这些需要注意的点列举出来。 环境 物理环境&#xff1a; i5 12450H 32G内存 无线…

css 3D背景反转实现

body{/* 透视 */perspective: 800px; } div{transform-style:preserve-3d;width:259px;height:396px;margin: 100px auto;position: relative; } div img{position: absolute;width:259px;height:396px;left:0;top:0;transition: all linear 2s;z-index: 0; } div img:nth-chil…

Centos7安装GItLab(在线版)

基础环境准备 1.配置清华大学镜像仓库 新建仓库配置文件使用 vim /etc/yum.repos.d/gitlab-ce.repo 命令&#xff0c;输入以下内容,保存 [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck0 enabl…

ThreadLocal+TaskDecorator实现父子线程 参数传递

一、背景 我定义注解&#xff0c;在切面中实现动态数据源切换&#xff0c;但是目标方法中&#xff0c;使用新开线程&#xff0c;异步的方式执行&#xff0c;导致在切面中主线程切换数据源参数&#xff0c;无法在异步的目标方法中使用。 二、实现方式 1、创建UserUtils类。 …

免费文章生成器的种类,3款免费的文章生成器推荐

内容创作无疑是网络营销和品牌建设中不可或缺的一环。许多人在日常工作中可能会面临时间不足、灵感枯竭等问题&#xff0c;本文将深入聊聊免费文章生成器的种类&#xff0c;详细介绍使用方法。 1. 免费文章生成器的种类 基于模板的生成器 这类生成器通常提供一系列文章模板&…

清新脱俗的Notes主页

大家好&#xff0c;才是真的好。 作为Notes客户端重度用户&#xff0c;我个人非常喜欢Notes客户机&#xff0c;平时都在使用。对于另一些Notes用户&#xff0c;喜欢Notes的人非常喜欢&#xff0c;而且还知道它非常强大&#xff0c;可以进行很多定制化。 今天我们来讲的就是No…

PHP:解决一个字符串中的斜杠 / 进行 JSON 编码时,斜杠被转义为 \/

一、修改前 问题代码 直接通过JSON编码&#xff0c;就会出现问题 代码 $url SO/.$fileName; echo json_encode($url); 效果 二、解决后 代码 使用 json_encode 函数的第二个参数 JSON_UNESCAPED_SLASHES 来禁止对斜杠进行转义 $url SO/.$fileName; echo json_encode…

C#调用cmd.exe(dos命令)两种方法(Process,Cli)

1、通过Process调用cmd命令 1&#xff09;C&#xff03;运行shell命令 string strCmdText; strCmdText "/C copy /b Image1.jpg Archive.rar Image2.jpg"; System.Diagnostics.Process.Start("CMD.exe",strCmdText); 2&#xff09;运行cmd命令隐藏控制…

html实现好看的个人博客留言板源码

文章目录 1.设计来源1.1 博客主界面1.2 常用源码1.3 我的文章1.4 留言板1.5 联系我 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134837482 html实现好看的个人博客留言…

【征稿倒计时十天,ACM独立出版,有确定的ISBN号,ei检索稳且快】

2023 人工智能、系统与网络安全国际学术会议 (AISNS 2023&#xff09; 2023 International Conference on Artificial Intelligence, Systems and Network Security 由西南科技大学计算机科学与技术学院主办的2023人工智能、系统与网络安全国际学术会议 (AISNS 2023&#xff0…

BearPi Std 板从入门到放弃 - 引气入体篇(9)(DAC->ADC)

简介 结合 BearPi Std 板从入门到放弃 - 引气入体篇&#xff08;7&#xff09;(DAC) 和 BearPi Std 板从入门到放弃 - 引气入体篇&#xff08;8&#xff09;(ADC) 这两篇&#xff0c; 实现 D -> A -> D 的转换, 也就是DAC -> ADC; 开发板 &#xff1a; Bearpi Std(小…

智能DNS与CDN:增强网络性能和用户体验

文章目录 智能DNS与CDN&#xff1a;增强网络性能和用户体验1. 智能DNS1.1 智能DNS简介1.2 智能DNS的工作原理1.3 智能DNS的优点 2. 内容分发网络&#xff08;CDN&#xff09;2.1 CDN简介2.2 CDN的工作原理2.3 CDN的优点 3. 智能DNS与CDN的结合4. 总结 智能DNS与CDN&#xff1a;…

浏览器判断某一个 ip 是否与其在同一个局域网的几种方式

前言 前段时间有个需求&#xff0c; 就是我们有做一个 web 的投屏端&#xff0c; 可以将另一个客户端(比如 android&#xff0c;ios&#xff0c;win&#xff0c;mac) 投屏到 web 站点来。 但是期间因为涉及到引流&#xff0c; 所以针对投屏的客户端是否在同一个局域网下要做不同…

三年没写了, 访问量竟然几十万次。

分享知道是我的爱好。 能帮助任何一个人都是值得的。

谈谈我对HashMap扩容机制的理解及底层实现

目录 一、HashMap的底层实现 二、HashMap扩容机制 概念 详细扩容&#xff1a; 1、初始容量 2、添加元素 3、元素数量检查 4、触发扩容 5、迁移元素 6、更新容量和阈值 代码&#xff1a; 一、HashMap的底层实现 HashMap 是 Java 中常用的数据结构之一&#xff0c;用于…

Python学习路线 - Python语言基础入门 - 判断语句

Python学习路线 - Python语言基础入门 - 判断语句 前言布尔类型和比较运算符布尔类型布尔类型的定义 比较运算符 if语句的基本格式if判断语句 if else 语句if elif else 语句判断语句的嵌套实战案例 前言 进行逻辑判断&#xff0c;是生活中常见的行为。同样&#xff0c;在程序…

Powerbuilder9.0 安装是一直卡在setup is running无法继续

这种情况是安装时&#xff0c;他后面弹出来一个提示框&#xff0c;但是因为其他进程的干扰&#xff0c;我们无法看到也就无法继续了。 我看到这个文章&#xff1a;https://blog.csdn.net/FLORY_/article/details/105244102 使用他说的方法的确有效。过程 1. 打开任务管理器 …

es常用查询编辑

查询指定id信息 GET /index_name/_doc/1074266245查询指定信息并降序 GET /index_name/_search {"query": {"term": {"deviceId": {"value": "1074266245"}}}, "sort": [{"timestamp": {"order&qu…

Mysql的事务日志

Mysql的事务具有四个特性&#xff1a;原子性、一致性、隔离性、持久性。那么事务的四种特性分别是靠什么机制实现的呢&#xff1f; 事务的隔离性由锁机制来保证 事务的原子性、一致性、持久性则由redo log和Undo log来保证。 - redo log是重做日志&#xff0c;提供再写入操作&…

子查询在SQL中的应用和实践

作者&#xff1a;CSDN-川川菜鸟 在SQL中&#xff0c;子查询是一种强大的工具&#xff0c;用于解决复杂的数据查询问题。本文将深入探讨子查询的概念、类型、规则&#xff0c;并通过具体案例展示其在实际应用中的用途。 文章目录 子查询概念子查询的类型子查询的规则实际案例分析…