Redis数据类型bitMap以及解决的相关实际需求

在Redis数据库中,Bitmap(位图)是一种特殊的数据结构,它不是一个独立的数据类型,而是基于String类型实现的。Bitmap主要用于存储大量二进制位(0或1)的数据,这些位可以代表不同的状态或标志。具体来说:

  • 存储原理: Redis的Bitmap实际上是利用String类型的最大容量(512 MB)存储一个连续的二进制序列,其中每个字节的8位可以分别代表8个独立的状态。这意味着你可以用一个Bitmap来跟踪多达数百万甚至数十亿的状态,只要状态总数不超过 2^(8 * (512 MB / 1 byte)),即大约 2^32 个状态(考虑到字符串末尾的结束符,实际可用的偏移量上限是 2^32 - 1)。

  • 常见操作: Redis提供了丰富的Bitmap操作命令,包括但不限于:

    • SETBIT key offset value:设置指定偏移量处的位状态。
    • GETBIT key offset:获取指定偏移量处的位状态。
    • BITCOUNT key [start end]:统计给定范围内为1的位的数量。
    • BITOP operation destkey key [key ...]:执行针对多个Bitmap的并集、交集、差集等位操作。
  • 应用场景: Bitmap在Redis中常用于以下场景:

    • 大规模用户在线状态记录:每位代表一个用户是否在线。
    • 用户行为标记:比如用户是否阅读过某篇文章、是否参与过某项活动等。
    • 大数据分析前的数据预处理:如用户画像构建,通过Bitmap记录用户属性,便于后续的批量统计和分析。
    • 布隆过滤器的实现:虽然Redis内并未直接提供布隆过滤器,但可以使用Bitmap和其他数据结构组合模拟布隆过滤器的功能。

这种数据结构的优点在于它的内存效率极高,特别适合存储需要频繁进行位运算且总体状态较多的情况。同时,Bitmap也可以与其他Redis数据结构结合,实现复杂的数据查询和处理逻辑。

SETBIT

SETBIT key offset value

对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。

位的设置或清除取决于 value 参数,可以是 0 也可以是 1 。

当 key 不存在时,自动生成一个新的字符串值。

字符串会进行伸展(grown)以确保它可以将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。

offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。

 

GETBIT

GETBIT key offset

对 key 所储存的字符串值,获取指定偏移量上的位(bit)。

当 offset 比字符串值的长度大,或者 key 不存在时,返回 0 。

 

BITCOUNT

BITCOUNT key [start] [end]

计算给定字符串中,被设置为 1 的比特位的数量。

一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。

start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。

不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。

 

BITOP

BITOP operation destkey key [key ...]

operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种:

  • 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 。

除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。

参考:

And  与   全1出1 
Or     或   有1出1
Not   非   有1出0 有0出1
Xor   异或 相同为0,不同为1 

 

需求:

学生签到

问题1(学生签到):某个具体的学生今年签到了多少天

我们做如下假设:这是某位同学的签到数据,1个单元格占用1bit空间

结果

新的问题

为什么我们统计0 1时返回的数据是2

原因

BITCOUNT key [start] [end]

我们的start end表示的是一个字节内的数据

我们将第九天也设置为签到后,再次统计得到的结果就是3

 

车展人数 

问题2(车展):三天一共来了多少人;这三天每天都来的人

我们做如下假设:这三天5、8、32分别代表三个人

我们设置以上基本数据

 

三天一共来了多少人

这三天每天都来的人

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

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

相关文章

SIFT 算法详解

SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)是一种用于图像处理和计算机视觉领域的特征提取算法,由David Lowe于1999年提出,并在2004年发表。SIFT 算法主要用于在图像中检测关键点并提取局部特征描述符…

C++之函数的重载

指函数名可以相同&#xff0c;提高复用性 函数重载满足条件&#xff1a; 1.同一个作用域下 2.函数名称相同 3.函数参数类型不同 或者 个数不同 或者 顺序不同 注意: 函数的返回值不可以作为函数重载的条件 //函数重载需要函数都在同一个作用域下 void func() {cout <<…

大模型日报2024-03-25

LLaVA-PruMerge: 高效多模态模型 摘要: LLaVA-PruMerge采用创新的自适应视觉令牌减少方法&#xff0c;显著降低大型多模态模型&#xff08;LMMs&#xff09;的视觉令牌数量&#xff0c;保持了模型性能&#xff0c;提升计算效率。 大型语言模型的探索能力研究 摘要: 本研究探讨了…

鸿蒙开发实例:【demo-搜索历史记录】

图片演示效果&#xff1a; 鸿蒙OS开发更多内容↓点击HarmonyOS与OpenHarmony技术鸿蒙技术文档开发知识更新库gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md在这。或mau123789学习&#xff0c;是v喔 代码演示&#xff1a; // 注&#xff1a;当前代码基于宽度为…

Java代码基础算法练习-报数问题-2024.03.26

任务描述&#xff1a; 有n个人围成一个圆圈分别编号1~n,从第1个到m循环报数&#xff0c;凡是报到m者离开&#xff0c;求n个 人离开圆圈的次序。 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.ArrayList; import java.util.List; import j…

时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测

时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测&#xff08;完整源码和数据…

类的成员方法和构造方法

1.类的成员方法: class student_information:nameNoneageNonedef say(self):print(f"hello classmates,Im {self.name},{self.age}years old") # self 表示类对象自身&#xff0c;必须出现selfdef say1(self,msg): # msg 外部传入的参数print(f"hello classmate…

【王道训练营】第6题 输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no

文章目录 我的代码改正代码其他代码 我的代码 没有完成 #include<stdio.h> int main(){int a;int b;int c0;//位数int d0;//比较几次scanf("%d",&a);while(b!0){bb/10;c;}dc/2;//比较几次int ffor(int i0 ;i<d;i){int ec;//位数fa - a / (((e-i-1)*10…

移动无线电传播与衰弱

文章目录 一、 一般路径损耗模型1. 1 自由环境下路径损耗1. 2 实际情况1.3 考虑阴影衰落 二、代码仿真2.1 仿真代码2.2 数值结果分析 参考 一、 一般路径损耗模型 1. 1 自由环境下路径损耗 根据著名的 Friis 公式&#xff0c;基站发射一个功率&#xff0c;用户得到的功率为&a…

zabbix安装及使用(错误及解决方案)

安装zabbix 常见错误&#xff1a; Zabbix下载错误 6.0与5.0版本冲突 解决方法 yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-get --skip-broken zabbix6.0-web 自己有数据库&#xff0c;使用以下命令 pid找不到 /var/log/zabbix/zabbix_server.log 错误&a…

解决Veeam备份服务器上磁带库状态显示offline断联

问题现象&#xff1a;周末服务器有断电后供电操作&#xff0c;再之后启动服务器发现veeam里磁带库连不上了。 检查磁带库&#xff0c;确认已开机了&#xff0c;带外也可登录 解决方法&#xff1a; 检查veeam服务器上的设备管理器&#xff0c;查看驱动是否正常 显示异常 右键选…

hadoop伪分布式环境启动时web端访问不到

在搭建hadoop伪分布式环境时&#xff0c;开启hdfs-site.sh后&#xff0c;web端访问不到&#xff0c;但是节点已经正常开启&#xff1a; 在尝试关闭防火墙后也没有效果&#xff0c;后来在/etc/hosts文件中加入本机的ip和主机名映射后&#xff0c;重新初始化namenode&#xff0c;…

C语言(结构体,联合体,枚举的讲解)

这期我们来讲解结构体&#xff0c;联合体&#xff0c;以及枚举的讲解&#xff0c;首先我们从概念开始一步一步的了解。 1&#xff0c;结构体 1.1概念 C 语言中的结构体是一种用户自定义的数据类型&#xff0c;它允许你将不同类型的变量组合在一起&#xff0c;从而形成一个新…

HBase常用的Filter过滤器操作

HBase过滤器种类很多&#xff0c;我们选择8种常用的过滤器进行介绍。为了获得更好的示例效果&#xff0c;先利用HBase Shell新建students表格&#xff0c;并往表格中进行写入多行数据。 一、数据准备工作 &#xff08;1&#xff09;在默认命名空间中新建表格students&#xf…

flask_restful规范返回值

使用方法 导入 flask_restful.marshal_with 装饰器 定义一个字典变量来指定需要返回的标准化字段&#xff0c;以及该字段的数据类型 在请求方法中&#xff0c;返回自定义对象的时候&#xff0c; flask_restful 会自动的读 取对象模型上的所有属性。 组装成一个符合标准化参…

AAPT: error: resource android:attr/dialogCornerRadius not found.

ERROR:D:\android.gradle\caches\transforms-3\b3b98118f65da38d0ad9da84cfc70a72\transformed\appcompat-1.0.0\res\values-v28\values-v28.xml:5:5-8:13: AAPT: error: resource android:attr/dialogCornerRadius not found. 请帮我看看这个错误是什么意思。我改如何做。 这个…

Linux环境基础开发工具使用——yum and vim

本篇将会介绍平时在Linux中开发常用到的一些工具&#xff0c;其中包括&#xff1a;软件包管理器 — yum&#xff0c;Liunx中的开发工具。具体的介绍了 yum 的相关操作以及 yum 源&#xff0c;同时还介绍了 windows与虚拟机如何进行的关联。然后对Liunx中的开发工具进行了详细的…

前端学习-CSS基础-Day1

一、CSS简介 1.1HTML局限性 只关注内容的语义&#xff0c;可以做简单的样式但是很臃肿且繁琐 1.2CSS优势 CSS层叠样式表&#xff0c;标记语言 设置HTML页面中的文本内容&#xff0c;图片外形&#xff0c;可以美化HTML&#xff0c;让页面布局更美观 HTML做框架&#xff0c;CSS做…

2020-Structure Aware Negative Sampling in Knowledge Graphs

摘要 使用对比估计学习知识图中实体和关系的低维表示是一种可扩展且有效的推断连接模式的方法。对比学习方法的一个关键方面是选择产生硬负样本的腐败分布&#xff0c;这迫使嵌入模型学习判别表示并找到观察数据的关键特征。虽然早期的方法要么采用过于简单的腐败分布&#xf…

基于java+springboot+vue实现的超市管理系统(文末源码+Lw+ppt)23-354

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对超市管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”…