【Redis7】10大数据类型之Bitmap类型

文章目录

  • 1.Bitmap(位图)
  • 2.常用命令
  • 3.示例
    • 3.1 SETBIT和GETBIT
    • 3.2 STRLEN
    • 3.3 BITCOUNT
    • 3.4 BITOP

1.Bitmap(位图)

Redis的Bitmap类型并不是一个独立的数据类型,而是对String类型的一种巧妙使用,允许开发者以位级别操作字符串中的数据。Bitmap可以视为一个巨大的位数组,每个位(bit)可以存储0或1的值,这使得Bitmap非常适合用于存储和操作大量的布尔值或者进行高效的统计计数。

Bitmap文持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42,9亿的字节信息(2^32=4294967296)

特点

  1. 空间效率:Bitmap极其节省空间。例如,一个整数占用4字节(32bit位),而使用Bitmap表示同样的32个布尔值只需要1字节。
  2. 灵活性:可以对每个位进行独立设置、清除、检查操作。
  3. 计算能力:支持按位与、或、异或等操作,以及位计数等高级操作,这对于统计和分析非常有用。
  4. 适用于计数和追踪:如网站用户是否登录、用户特征标记、事件发生频率统计等场景。

2.常用命令

  • SETBIT key offset value:设置位图中指定偏移量的值。
  • GETBIT key offset:获取位图中指定偏移量的值。
  • strlen key:获取该Bitmap所占用的字节数,而不是比特位中1的个数。
  • BITCOUNT key [start end]:计算位图中位值为1的个数,可选地限制在指定范围内。
  • BITOP operation destkey key [key ...]:对多个位图执行AND、OR、NOT、XOR操作,并将结果保存到destkey。
  • BITFIELD key [GET type offset] [SET type offset value] [...]:更复杂的位操作,可以一次执行多个位操作。

3.示例

3.1 SETBIT和GETBIT

SETBIT key offset value:设置位图中指定偏移量的值。

GETBIT key offset:获取位图中指定偏移量的值。

offset从0开始

127.0.0.1:6379> setbit k1 1 1
(integer) 0 # 返回值是设置前的值
127.0.0.1:6379> setbit k1 1 0
(integer) 1
127.0.0.1:6379> setbit k1 2 1 
(integer) 0
127.0.0.1:6379> setbit k1 3 3 # 值只能是0和1
(error) ERR bit is not an integer or out of range
127.0.0.1:6379> getbit k1 0
(integer) 0
127.0.0.1:6379> getbit k1 1
(integer) 0
127.0.0.1:6379> getbit k1 2
(integer) 1
127.0.0.1:6379> 

3.2 STRLEN

strlen key:获取该Bitmap所占用的字节数,而不是比特位中1的个数。

127.0.0.1:6379> setbit k1 7 1
(integer) 1
127.0.0.1:6379> strlen k1
(integer) 1
127.0.0.1:6379> setbit k1 8 0
(integer) 0
127.0.0.1:6379> strlen k1
(integer) 2
127.0.0.1:6379> 

不是字符串长度而是占据几个字节,超过8位后自己按照8位一组一byte再扩容

3.3 BITCOUNT

BITCOUNT key [start end]:计算位图中位值为1的个数,可选地限制在指定范围内。

127.0.0.1:6379> setbit k1 0 1
(integer) 0
127.0.0.1:6379> setbit k1 1 1
(integer) 0
127.0.0.1:6379> setbit k1 7 1
(integer) 0
127.0.0.1:6379> bitcount k1 
(integer) 3
127.0.0.1:6379> bitcount k1 0 3
(integer) 3
127.0.0.1:6379> bitcount k1 0 3 byte # 以byte为单位
(integer) 3
127.0.0.1:6379> bitcount k1 0 3 bit # 以bit为单位
(integer) 2
127.0.0.1:6379> 

3.4 BITOP

BITOP operation destkey key [key ...]:对多个位图执行AND(与)、OR(或)、XOR(异或)和NOT(非)操作,并将结果保存到destkey。

假设我们有两个Bitmap键use1user2,分别代表了两天内用户的在线状态,其中1表示在线,0表示离线。

他们三天中的在线状态如下:

127.0.0.1:6379> setbit user1 0 1
(integer) 0
127.0.0.1:6379> setbit user1 1 1
(integer) 0
127.0.0.1:6379> setbit user2 0 1
(integer) 0
127.0.0.1:6379> setbit user2 2 1
(integer) 0
127.0.0.1:6379> 

如果想要找出这两天都在线的用户,可以使用AND操作。

127.0.0.1:6379> bitop and k1 user1 user2
(integer) 1
127.0.0.1:6379> getbit k1 0
(integer) 1
127.0.0.1:6379> getbit k1 1
(integer) 0
127.0.0.1:6379> 

and操作: user1和user2对应位都是1的情况下才为1,否则为0。

如果我们想找出至少有一天在线的用户,可以使用OR操作。

127.0.0.1:6379> bitop or k2 user1 user2
(integer) 1
127.0.0.1:6379> bitcount k2
(integer) 3
127.0.0.1:6379> 

or操作: user1和user2只要有1,就是1.否则为0

如果我们要找出只在某一天在线,而不在另一天在线的用户,可以使用XOR操作。

127.0.0.1:6379> getbit k3 0
(integer) 0
127.0.0.1:6379> getbit k3 1
(integer) 1
127.0.0.1:6379> getbit k3 2
(integer) 1
127.0.0.1:6379> 

xor操作:user1和user2对应位不同时为1(即一位是1另一位是0)

另外,BITOP命令不直接支持NOT操作,因为NOT操作需要一个源位图和目标位图。但是,可以通过创建一个全1的Bitmap(假设长度与原Bitmap相同),然后使用XOR操作达到NOT的效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TriCore: 从RTOS内核的角度看CSA

今天尝试从RTOS内核的角度来看看 TriCore 的 CSA。 CSA的细节信息可以参考前一篇文章 TriCore User Manual 笔记 1-CSDN博客 CSA 的全称是 Context Save Area,顾名思义就是专门用来保存上下文的一块存储区域。 既然是上下文使用,那必然要求低延迟&…

【Leetcode每日一题】 分治 - 交易逆序对的总数(难度⭐⭐⭐)(74)

1. 题目解析 题目链接:LCR 170. 交易逆序对的总数 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 归并排序的基本思路 归并排序将数组从中间分成两部分,在排序的过程中,逆序对的来…

民航电子数据库:在console或服务器登录数据库

目录 前言登录切换数据库 前言 在不使用数据库管理工具的情况下,可以在console或服务器上操作数据库,这时就需要使用相关命令登录到数据库 登录 caeconsole nssl IP地址 端口 数据库名称 用户名 密码 切换数据库 use 数据库名称

springboot+vue+mybatis警情高发智能灯箱+PPT+论文+讲解+售后

时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,警情高发智能灯箱当然不能排除在外。警情高发智能灯箱是在实际应用和软件工程的开发原理之上,运用微信开发者、java语言以及SpringBo…

拦截器添加以及注册

自定义拦截器 自定义一个类 实现 HandlerInterceptor 接口 并重写里面的方法 preHandle、postHandle、afterCompletion preHandle:在执行具体的Controller方法之前调用 postHandle:controller执行完毕之后被调用 afterCompletion:方法需要…

关于FreeRTOS/Nuttx/Zephyr对于用户态程序实现的对比

前言: 现在很多单片机有MPU。比如STM32F4 F7 H7等以ARM CM3 CM4 CM为架构的单片机。那么现在很多RTOS都支持MPU配置,利用MPU实现用户态程序和内核态程序隔离。 从用户产品经理角度出发,作为RTOS的使用者,以一个简单的商业例子来…

区块链 | NFT 水印:Review on Watermarking Techniques(三)

🍍原文:Review on Watermarking Techniques Aiming Authentication of Digital Image Artistic Works Minted as NFTs into Blockchains 一个 NFT 的水印认证协议 可以引入第三方实体来实现对交易的认证,即通过使用 R S A \mathsf{RSA} RSA…

喜报|知从科技荣获“2023年度浦东新区创新创业奖”

4月11日,由上海市浦东新区人民政府举办的“2024年浦东新区经济突出贡献企业表彰活动”在上海国际会议中心隆重举行。知从科技凭借过去一年在行业内卓越的技术创新实力及对浦东新区发展作出的杰出贡献,入选创新创业20强企业,荣获“2023年度浦东…

Coze扣子开发指南:用免费API自己创建插件

虽然Coze扣子现在插件商店已经有几百个插件了,但相对于海量人群的众多差异化需求,还是远远不够的。如果插件商店没有合适的插件,其实完成可以自己创建,过程也很简单,不需要编写任何代码。 首先打开个人空间&#xff0…

python:做柱状图

import matplotlib.pyplot as plt # 数据 categories [A, B, C, D] values [23, 45, 56, 78] # 创建柱状图 plt.bar(categories, values) # 添加标题和标签 plt.title(柱状图示例) plt.xlabel(类别) plt.ylabel(数值) # 显示图形 plt.show() D:\software\新建文件夹\python\L…

elementui- button按钮自适应大小

<el-button type"primary" class"daochu" click"download">导出</el-button> .daochu {width: calc(100vw * 80 / 1920);height: calc(100vw * 30 / 1920);font-size: calc(100vw * 13 / 1920); } 效果图&#xff1a;

顺序表详解及应用(通讯录的实现)

一.线性表 线性表&#xff1a;n个具有相同特性的的数据元素的有限序列。线性表是一种在实际中广泛应用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表&#xff0c;链表&#xff0c;栈&#xff0c;队列&#xff0c;字符串... 线性表在逻辑上是线性结构&#xff0c;也就…

一、计算机基础(Java零基础一)

&#x1f33b;&#x1f33b;目录 一、&#x1f33b;&#x1f33b;剖析学习Java前的疑问&#x1f33b;&#x1f33b;1.1 零基础学习编程1.2 英语不好能学吗&#xff1f;1.3 理解慢能学好吗&#xff1f;1.4 现在学Java晚吗&#xff1f;1.5 Java 和 Python 还有 Go 的选择1.6 Java…

Rust 使用egui创建一个简单的下载器demo

仓库连接: https://github.com/GaN601/egui-demo-download-util 这是我第一个rust gui demo, 学习rust有挺长时间了, 但是一直没有落实到实践中, 本着对桌面应用的兴趣, 考察了slint、egui两种框架, 最后还是选择了egui. 这篇博客同时包含我当前的一些理解, 但是自身技术有限,…

ESP8266基础资源了解

封装的硬件资源 参考1&#xff0c;参考2 常说的esp8266指的是有一个屏蔽罩盖着的模块&#xff0c;里面包含了esp8266芯片和一个能够存储数据和程序的flash&#xff0c;因为esp8266没有存储功能。 使用arduino常用的nodemcu是包含这个模块并含有电源LDO和串口下载的设计电路如…

WINDOWS下zookeeper突然无法启动但是端口未占用的解决办法(用了WSL)

windows下用着用着时候突然zookeeper启动不了了。netstat查也没有找到端口占用&#xff0c;就是起不来。控制台报错 java.lang.reflect.UndeclaredThrowableException: nullat org.springframework.util.ReflectionUtils.rethrowRuntimeException(ReflectionUtils.java:147) ~…

铁山靠之数学建模 - Matlab入门

Matlab基础 1. Matlab界面与基本操作1.1 matlab帮助系统1.2 matlab命令1.3 matlab功能符号1.4 matlab的数据类型1.5 函数计算1.6 matlab向量1.7 matlab多项式1.8 M文件1.9 函数文件1.10 matlab的程序结构1.11 echo、warning和error函数1.12 交互输入1.13 程序调试1.14 设置断点…

Centos固定静态ip地址

这里我用的是Vmware虚拟机搭建的三台机器 进入 cd /etc/sysconfig/network-scripts然后使用 ip addr命令&#xff0c;查看自己虚拟机的以太网地址。 我这里是ens33 上面的第一个选项是本地环回地址&#xff0c;不用管它 然后查看刚刚进入的network-scripts目录下的文件 找到…

Mybatis框架笔记:基础信息

1.Mybatis介绍 MyBatis本是apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache software foundation迁移到了google code&#xff0c;并且改名为MyBatis。2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合&#xff0c;是一个基于Java的持…

AI赋能EasyCVR视频汇聚/视频监控平台加快医院安防体系数字化转型升级

近来&#xff0c;云南镇雄一医院发生持刀伤人事件持续发酵&#xff0c;目前已造成2人死亡21人受伤。此类事件在医院层出不穷&#xff0c;有的是因为医患纠纷、有的是因为打架斗殴。而且在每日大量流动的人口中&#xff0c;一些不法分子也将罪恶的手伸到了医院&#xff0c;实行扒…
最新文章