使用Bitmaps位图实现Redis签到

系列文章目录


文章目录

  • 系列文章目录
  • 前言


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述


Redis提供了Bitmaps这个“数据类型”可以实现对位的操作:
(1) Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符串的位进行操作。
(2) Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。
在这里插入图片描述
首先我们要理解几个命令,特别是最后一个,这些命令可以参考Redis文档。

SETBIT key offset value
设置或者清空key的value(字符串)在offset处的bit值。

SETBIT bit:sign 2 1

GETBIT key offset
返回key对应的string在offset处的bit值,当offset超出了字符串长度的时候,这个字符串就被假定为由0比特填充的连续空间。

GETBIT bit:sign 2

BITCOUNT key [start end]
统计字符串被设置为1的bit数。对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。

SETBIT bit:sign 2 1
SETBIT bit:sign 5 1
BITCOUNT bit:sign

BITPOS key bit [start] [end]
返回字符串里面第一个被设置为1或者0的bit位。

BITPOS bit:sign 1

BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
BITFIELD命令能操作多字节位域,它会执行一系列操作,并返回一个响应数组,在参数列表中每个响应数组匹配相应的操作。

BITFIELD bit:sign get u1 2

从offset-2开始,取一位,结果为无符号数(u),也可以进行多个操作

BITFIELD bit:sign get u1 2 get u1 5

其次是如何在我们的代码中使用,由于目前代码都集成Spring使用RedisTemplate来操作,这里使用RedisTemplate来演示。
代码中的位运算操作,可以百度“Java语言位运算符详解”参考别人文章理解。

/*** 用户签到功能*/
private static final String USER_SIGN = "USER_SIGN:%d:%s";
private static String buildSignKey(Long uid, LocalDate date) {return String.format(USER_SIGN, uid, formatDate(date));
}
@Test
public void testBit() {String bitKey = buildSignKey(100000L, LocalDate.now());// 当前签到情况LocalDate date = LocalDate.now();redisTemplate.delete(bitKey);// offset是从0开始的,因此2号签到,offset要标记为1int todayOffset = date.getDayOfMonth() - 1;redisTemplate.opsForValue().setBit(bitKey, 3, true); // 4号签到redisTemplate.opsForValue().setBit(bitKey, 4, true); // 5号签到redisTemplate.opsForValue().setBit(bitKey, 5, true); // 6号签到redisTemplate.opsForValue()

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

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

相关文章

基于单片机的汽车尾灯控制系统设计

**单片机设计介绍,基于单片机的汽车尾灯控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的汽车尾灯控制系统设计概要主要涵盖利用单片机技术实现对汽车尾灯的智能控制。下面将从系统构成、工作…

RPM与YUM

目录 rpm包的管理 介绍 rpm包的简单查询指令 rpm包名基本格式 rpm包的其他查询指令: 卸载rpm包 yum 介绍 rpm包的管理 介绍 rpm用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文件.RPM是RedHat Package Manager(RedHat)软件包管…

Flutter应用混淆技术原理与实践

在移动应用开发中,保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具,帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆,并提供了相关的操作步骤和注意事项。 📝 摘要 本…

【数学公式大全整理——1.0】

导数公式 积分表 万能公式 初等函数 重要极限 ### 诱导公式 和差角 和差化积 倍角公式 半角公式 正弦 余弦定理 反三角函数 高阶求导公式

c++对象指针

对象指针在使用之前必须先进行初始化。可以让它指向一个已定义的对象,也可以用new运算符动态建立堆对象。 定义对象指针的格式为: 类名 *对象指针 &对象; //或者 类名 *对象指针 new 类名(参数); 用对象指针访问对象数据成员的格式为&#xff1a…

毕马威:《智慧之眼:开启汽车感知新时代》

在全球科技飞速发展和产业革新的大潮中,汽车产业正在以前所未有的速度向网联化、智能化的方向转型。汽车传感器作为智能联网汽车发展的关键环节之一,扮演着举足轻重的角色。 毕马威一直关注汽车产业的变化与发展,为了更好地为汽车行业赋能&a…

测开——基础理论面试题整理

1. 测试流程 需求了解分析需求评审制定测试计划【包括测试人员、时间、每人负责的模块、测试的风险项以及预防】编写自动化测试用例 —— 测试评审【尽量丰富测试点】编写测试框架和脚本(若是功能测试 可省去这步骤)执行测试提交缺陷报告测试分析与评审…

Python字符串操作方法一览表

字符串操作 你患得患失太在意从前又太担心将来,有句话说的好昨天是段历史,明天是个谜团而今天是天赐的礼物 像珍惜礼物那样珍惜今天。—— 龟大仙《功夫熊猫3》 1.字符串连接 例子: str1 "Hello" str2 "World" resul…

你知道核相仪的作用和功能吗?使用核相仪要注意哪些事项?

一、核相仪的作用 核相仪是电力系统中一种具有重要检测功能的工具,其主要用途是确定电力线路或变压器两侧之间的相位关系。核相仪的主要作用体现在以下几个方面: 1、相位校验:核相仪的核心功能是准确测定高压或低压电力线路的相位&#xff0c…

华为openEuler-22.03-LTS-SP3配置yum源

先有华为后有天,遥遥领先! 1 确定使用的OS版本 # cat /etc/os-release NAME"openEuler" VERSION"22.03 (LTS-SP3)" ID"openEuler" VERSION_ID"22.03" PRETTY_NAME"openEuler 22.03 (LTS-SP3)" ANSI…

数据结构——栈(C语言版)

前言: 在学习完数据结构顺序表和链表之后,其实我们就可以做很多事情了,后面的栈和队列,其实就是对前面的顺序表和链表的灵活运用,今天我们就来学习一下栈的原理和应用。 准备工作:本人习惯将文件放在test.c…

Python基础之pandas:文件读取与数据处理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、文件读取1.以pd.read_csv()为例:2.数据查看 二、数据离散化、排序1.pd.cut()离散化,以按范围加标签为例2. pd.qcut()实现离散化3.排序4.…