Redis——》数据类型:bitmap

news2025/1/15 2:29:55

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Redis】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】

Redis——》数据类型:bitmap

  • 一、底层结构
  • 二、最大长度
  • 三、操作示例
    • 1、setbit:设置二进制位的值
    • 2、getbit:获取二进制位的值
    • 3、bitcount:统计二进制位为1的数量
    • 4、bitops:查找第一个指定的二进制位值
    • 5、bitop:位操作
    • 6、bitfield:在位图中存储整数值
  • 四、使用场景
    • 1、记录用户登录状态
    • 2、统计用户登录天数
    • 3、统计用户每个月的签到情况
    • 4、统计连续签到用户总数

一、底层结构

由多个二进制位组成的数组,数组中的每个二进制位都有与之对应的偏移量(也称索引),用户通过这些偏移量可以对位图中指定的一个或多个二进制位进行操作。

二、最大长度

512Mb = 512 * 1024 * 1024 * 8 = 2^32

三、操作示例

命令帮助语法描述
setbithelp setbitsetbit key offset value设置二进制位的值
getbithelp getbitgetbit key offset获取二进制位的值
bitcounthelp bitcountbitcount key [start end]统计二进制位为1的数量
bitopshelp bitopsbitpos key bit [start] [end]查找第一个指定的二进制位值
bitophelp bitopbitop and destkey key [key …]对一个或多个 key 求逻辑并,并将结果保存到 destkey
bitop or destkey key [key …]对一个或多个 key 求逻辑或,并将结果保存到 destkey
bitop xor destkey key [key …]对一个或多个 key 求逻辑异或,并将结果保存到 destkey
bitop not destkey key对给定 key 求逻辑非,并将结果保存到 destkey
bitfield在位图中存储整数值

1、setbit:设置二进制位的值

注意:
(1)如果设置某个偏移量超出了现有的内容范围,位数组就会自动扩充。
因为Redis对位图的扩展操作是以字节为单位进行的,所以扩展之后的位图包含的二进制位数量可能会比用户要求多一些,并且在扩展位图的同时,Redis还会将所有未被设置的二进制位的值初始化为0。
(2)setbit命令只能使用正数偏移量,输入负数会报错

setbit key offset value

# 底层的二进制:10000000
setbit k1 0 1

# 底层存储的二进制:10010000
setbit k1 3 1

# 底层存储的二进制:10010100
setbit k1 5 1

# 底层存储的二进制:10010100 01000000
setbit k1 9 1

在这里插入图片描述

2、getbit:获取二进制位的值

注意:
如果输入的偏移量超过了位图目前拥有的最大偏移量,那么getbit命令将返回0

getbit key offset

getbit k1 0
getbit k1 3
getbit k1 5
getbit k1 7
getbit k1 111

在这里插入图片描述

3、bitcount:统计二进制位为1的数量

注意:
(1)默认对所有字节中的二进制位进行统计
(2)start、end对指定字节范围内的二进制位进行统计(正向字节偏移量从0开始,反向从-1开始)

bitcount key [start end]

命令描述
bitcount k1在所有字节中,统计二进制位为1的数量
bitcount k1 0 -1在所有字节中,统计二进制位为1的数量
bitcount k1 0 0在第1个字节中,统计二进制位为1的数量
bitcount k1 1 1在第2个字节中,统计二进制位为1的数量
bitcount k1 -1 -1在最后1个字节中,统计二进制位为1的数量
bitcount k1 -2 -2在倒数第2个字节中,统计二进制位为1的数量
bitcount k1 0 1在前2个字节中,统计二进制位为1的数量
bitcount k1 -2 -1在后2个字节中,统计二进制位为1的数量

在这里插入图片描述

4、bitops:查找第一个指定的二进制位值

注意:
(1)默认对所有字节中查找第一个指定的二进制位值
(2)start、end对指定字节范围内查找第一个指定的二进制位值(正向字节偏移量从0开始,反向从-1开始)
(3)对一个不存在的位图或者一个所有位都被设置成0的位图中查找值为1的二进制位时,BITPOS命令将返回-1

bitpos key bit [start] [end]

命令描述
bitpos k1 0在所有字节中,查找第1个为0的位偏移量
bitpos k1 1在所有字节中,查找第1个为1的位偏移量
bitpos k1 1 0 -1在所有字节中,查找第1个为1的位偏移量
bitpos k1 1 0 0在第1个字节中,查找第1个为1的位偏移量
bitpos k1 1 1 1在第2个字节中,查找第1个为1的位偏移量
bitpos k1 1 -1 -1在最后1个字节中,查找第1个为1的位偏移量
bitpos k1 1 -2 -2在倒数第2个字节中,查找第1个被设置为1的位偏移量
bitpos k1 1 0 1在前2个字节中,查找第1个被设置为1的位偏移量
bitpos k1 1 -2 -1在后2个字节中,查找第1个被设置为1的位偏移量

在这里插入图片描述

5、bitop:位操作

注意:
当BITOP命令在对两个长度不同的位图执行运算时,会将长度较短的那个位图中不存在的二进制位的值看作0。

命令描述
bitop and destkey key [key …]对一个或多个 key 求逻辑并,并将结果保存到 destkey
bitop or destkey key [key …]对一个或多个 key 求逻辑或,并将结果保存到 destkey
bitop xor destkey key [key …]对一个或多个 key 求逻辑异或,并将结果保存到 destkey
bitop not destkey key对给定 key 求逻辑非,并将结果保存到 destkey
# bitmap1:01010011
# bitmap2:1001010010010101

bitop and and_result bitmap1 bitmap2
bitop or or_result bitmap1 bitmap2
bitop xor xor_result bitmap1 bitmap2
bitop not not_result bitmap1

在这里插入图片描述

6、bitfield:在位图中存储整数值

四、使用场景

# 设置二进制位的值
setbit key offset value

# 获取二进制位的值
getbit key offset

# 统计二制位为1的数量
bitcount key [start end]

# 查找第一个指定的二进制位值
bitpos key bit [start] [end]

# 对一个或多个 key 求逻辑并,并将结果保存到 destkey 
bitop and destkey key [key …]	

1、记录用户登录状态

以下属于同一类场景:

  • 记录用户登录状态
  • 记录用户打卡状态
  • 记录用户参与活动状态
假设用户ID为10086

思路:
	key		:存储用户登陆状态集合数据,当前为user:login:status
	offset	:存储用户ID,当前为10086
	value	:存储登录状态(在线为1,下线为0)

# 记录用户登录
setbit user:login:status 10086 1

# 记录用户登出
setbit user:login:status 10086 0

# 判断用户是否登录(在线为1,下线为0)
getbit user:login:status 10086

2、统计用户登录天数

一年最多366天 = 366个二进制位 = 45.75个字节 ≈ 46个字节

假设用户ID为10086

思路:
	key		:存储用户登陆状态集合数据,当前为user:login:10086
	offset:存储天数-1
	value	:存储登录状态(在线为1,下线为0)

# 记录用户第2天登录
setbit user:login:10086 1 1

# 记录用户第8天登录
set user:login:10086 7 1

# 记录用户第365天登录
set user:login:10086 364 1

# 字节长度:46
strlen sean

# 统计用户登录天数
bitcount user:login:10086

# 统计用户最后2周登录天数,结果:1
bitcount user:login:10086 -2 -1

3、统计用户每个月的签到情况

假设用户ID为10086,当前日期为2022年11月29日

思路:
	key		:存储用户每月每天签到状态集合数据,当前为user:sign:{userId}:{yyyyMM}
	offset	:存储对应日期-1(因为offset从0开始)
	value	:存储签到状态(签到为1,未签到为0)


# 记录用户2022年11月29日签到
setbit user:sign:10086:202211 28 1

# 判断用户2022年11月29日是否签到
getbit user:sign:10086:202211 28

# 统计用户2022年11月签到次数
bitcount user:sign:10086:202211

# 查找用户2022年11月首次签到日期(因为offset从0开始,所以日期值=offset+1)
bitpos user:sign:10086:202211 1

4、统计连续签到用户总数

假设从2022年11月27日到2022年11月29日,如何统计出这3天连续打卡用户总数?

思路:
	(1)3天对应3个Bitmap,并且offset上的userID都是一样的。
	(2)3个Bitmap做『并』运算(如果offset上的值都为1,则说明这个用户3天连续打卡)。
	(3)把『并』结果保存到一个新 Bitmap 中,统计 bit = 1 的个数便得到了连续打卡 3 天的用户总数了。


# 记录2022年11月27日用户签到
setbit user:sign:20221127 10086 1
setbit user:sign:20221127 10087 1
setbit user:sign:20221127 10088 1
setbit user:sign:20221127 10089 1


# 记录2022年11月28日用户签到
setbit user:sign:20221128 10087 1
setbit user:sign:20221128 10088 1
setbit user:sign:20221128 10089 1


# 记录2022年11月29日用户签到
setbit user:sign:20221129 10088 1
setbit user:sign:20221129 10089 1

# 与操作
bitop and destkey user:sign:20221127 user:sign:20221128 user:sign:20221129

# 统计 bit 位 = 1 的个数
bitcount destkey 1

在这里插入图片描述

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

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

相关文章

IPv6进阶:IPv6 过渡技术之 6to4 自动隧道

实验拓扑 R1-R3-R2之间的网络为IPv4公网;PC1及PC2处于IPv6孤岛。 实验需求 R1及R2为IPv6/IPv4双栈设备;在R1及R2上部署6to4自动隧道使得PC1及PC2能够互相访问。 实验步骤及配置 Internet Router的配置如下 [R3] interface GigabitEthernet0/0/0 [R3…

gan与dcgan训练自己的数据集

gan https://blog.csdn.net/weixin_50113231/article/details/122959899 dcgan 源码地址:https://github.com/carpedm20/DCGAN-tensorflow 安装教程 环境配置 将代码克隆到本地后首先按照官网所需依赖环境进行配置 由于该文章比较早所以python与tensorflow最好按…

做好QA质量管理,4大注意事项和技巧。

1、QA检查单:全过程质量管理体系。 为了做好过程质量管理,QA检查单需要按照检查类型、检查阶段、实践域、检查对象、检查项进行层层划分,构建了全过程质量管理体系。 如QA检查单按照检查阶段划分为:需求分析、系统设计、系统实现、…

5G无线技术基础自学系列 | SU-MIMO原理

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 通过多天线技术支持单用户在上下行数据…

SSM考试题库管理系统毕业设计源码069043

SSM考试题库管理系统 摘 要 随着计算机办公自动化程度的不断提高,开发各种数据库管理应用软件用于各种工作中能有效地提高工作效率,节省时间,能使学校的教学工作上一个新的台阶。传统的人工命题形成试卷,往往会出现大量的重复劳动…

java 串口通讯获取检验码

/*** 获取校验码* crc16 X16x15x21* 16进制报文是 02 03 00 00 00 40 CRC16* 传输的str:“020300000040”* 结果:4409* param str* return*/ public static String getCRC(String str) {byte[] bytes NumberUtils.hexStringToBytes(str);int CRC 0x000…

【Spring Boot】Spring Boot 统一功能处理

文章目录Spring拦截器为何需要Spring拦截器?自定义拦截器加入系统配置并配置拦截规则验证登陆拦截器添加统一访问前缀验证统一前缀是否添加成功统一异常处理统一数据返回格式Spring拦截器 为何需要Spring拦截器? 在之前Servlet开发中,对登陆…

深入理解java虚拟机:虚拟机字节码执行引擎(2)

文章目录3. 方法调用3.1 解析3.2 分派接着深入理解java虚拟机:虚拟机字节码执行引擎(1),我们继续往下看: 3. 方法调用 方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本&…

【LeetCode每日一题】——771.宝石与石头

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 字符串 二【题目难度】 简单 三【题目编号】 771.宝石与石头 四【题目描述】 给你一个字符串…

配电网电压调节及通信联系研究(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

三年城市NOH落地100城,毫末智行内部信剑指2025

11月29日,毫末智行董事长张凯、CEO顾维灏联合发布《毫末智行三周岁:三年磨一剑 利刃开新篇》的内部信,提到毫末愿景及战略目标:“让机器智能移动,给生活更多美好。”未来成长为一家产品矩阵覆盖全无人驾驶、机器人等多…

[附源码]Python计算机毕业设计Django“科教兴国”支教门户网站

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【毕业设计】26-基于单片机心跳体温血压系统仿真设计(原理图+仿真+演示视频+论文)

【毕业设计】基于单片机心跳体温血压系统仿真设计(原理图仿真演示视频论文) 文章目录【毕业设计】基于单片机心跳体温血压系统仿真设计(原理图仿真演示视频论文)任务书设计说明书摘要设计说明书及设计文件任务书 以单片机为控制核…

DPDK helloworld示例程序

目录 helloworld源代码 helloword编译 helloworld代码解析 DPDK的helloworld示例程序&#xff0c;用以示例DPDK应用程序的编写和使用。 helloworld源代码 helloworld代码构成&#xff1a; /* 省略系统头文件*//* DPDK相关的rte头文件 */ #include <rte_memory.h>…

springboot 集成JWT实现token验证

JWT介绍 是一种开放标准 &#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且独立的方式&#xff0c;用于将信息作为 JSON 对象在各方之间安全地传输。该信息可以进行验证和信任&#xff0c;因为它是经过数字签名的。JWT 可以使用密钥&#xff08;使用 HMAC 算法…

拾忆书苑(图书商城系统)网站的设计与实现(html;DIV+CSS; Bootstrap; Dreamweaver; Photoshop)

目 录 一、绪论 1 &#xff08;一&#xff09;课题研究背景 1 &#xff08;二&#xff09;课题研究目的及意义 1 二、相关技术与工具介绍 1 &#xff08;一&#xff09;Dreamweaver开发技术 1 &#xff08;二&#xff09;Adobe Photoshop 1 三、拾忆书店网站的设计与分析 2 &am…

某村庄供水工程设计(设计报告+cad图纸+预算工程量清单)

目 录 工程特性表 1 1 综合说明 3 1.1 工程背景 3 1.2 设计依据 3 1.3 工程建设的必要性与可行性 3 1.4 供水范围、规模及水源选择 4 1.5 工程总体布置 4 1.6 工程设计 4 1.7 工程施工 5 1.8 工程管理 5 1.9 预算 5 2 项目区概况及项目建设的必要性 6 2.1 项目区自然概况 6 2.2…

Head First设计模式(阅读笔记)-06.命令模式

家电自动化遥控器 假设要创建一个遥控器&#xff0c;该遥控器上有7个插槽(每个可以插上不同的家电)&#xff0c;每个插槽对应了开关按钮&#xff0c;并且遥控器上还有一个撤销按钮用于撤销上一次的操作 从餐厅点餐开始 假设一个顾客来到餐厅要进行点餐&#xff0c;整体流程如下…

不用ps怎么修改图片?电脑图片在线处理的方法

很多小伙伴在工作、学习的时候会用到简单的图片处理工具&#xff08;在线ps 图片编辑制作工具 免费照片编辑器_压缩图&#xff09;&#xff0c;但是因为用到的功能比较多&#xff0c;需要下载安装很多电脑处理图片软件&#xff0c;非常不方便&#xff0c;而且上手比较难。下面就…

【学习笔记53】JavaScript正则表达式练习题

正则表达式练习题一、用户名、密码和手机号的验证1、案例要求2、案例分析3、HTML和CSS代码4、JS代码二、密码强度1、案例要求2、案例分析3、HTML和CSS代码4、JS代码的实现三、书写正则验证邮箱1、邮箱的验证2、代码的实现四、书写正则验证0~255的数字一、用户名、密码和手机号的…