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

Redis教程——Redis bitmap位图操作(图解) 在平时开发过程中,经常会有一些 bool 类型数据需要存取。比如记录用户一年内签到的次数,签了是 1,没签是 0。如果使用 key-value 来存储,那么每个用户都要记录 365 次,当用户成百上亿时,需要的存储空间将非常巨大。为了解决这个问题,Redis 提供了位图结构。位图(bitmap)同样属于 string 数据类型。Redis 中一个字符串类型的值最多能存储 512 MB 的内容,每个字符串由多个字节组成,每个字节又由 8 个 Bit 位组成。 阅读详情

在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分别代表三个人

我们设置以上基本数据

三天一共来了多少人

这三天每天都来的人

Redis 基础 -- 位图(bitmap)数据结构和 bitmap的常用命令(SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP、BITFIELD) Redis的位图(bitmap)是由多个二进制位组成的数组,数组中的每个二进制位都有与之对应的偏移量(也称索引),用户通过这些偏移量可以对位图中指定的一个或多个二进制位进行操作。 阅读详情

相关推荐

redis bitmap数据类型调研

它允许你在单个命令中对一个或多个位域(bit field)进行操作,包括获取和设置指定位域的值,支持不同的编码方式(如有符号整数和无符号整数),还能处理溢出情况。官方文档介绍,bitmap能操作的最大偏移量是2^32,所以这里也限制了bitmap的最大容量为512MB,而且最后设置的位如果快到了2的32次方,那么就可能会存在阻塞的情况,下面是官方文档的原文。只能用于读取操作,不能进行写入操作(如设置位域的值、增加位域的值等),这使得它在只需要获取位图信息而不修改位图的场景下使用,能避免意外的数据修改。

Xingshi89的专栏 1196

Redis 如何使用 Bitmap

1. Bitmap 是什么 Bitmap(也称为位数组或者位向量等)是一种实现对位的操作的'数据结构',在数据结构加引号主要因为: Bitmap 本身不是一种数据结构,底层实际上是字符串,可以借助字符串进行位操作。 Bitmap 单独提供了一套命令,所以与使用字符串的方法不太相同。可以把 Bitmaps 想象成一个以位为单位的数组,数组的每个单元只能存储 0 和 1,数组的下标在 Bitmap 中叫做偏移量 offset。 2. 占用存储空间 如上我们知道 Bitmap 本身不是一种

Trouvailless的博客 1万+

Redis数据类型String之bitmap

今天来总结一下最近学些的redis数据类型string之bitmap 操作 相关命令 先用一下代码查看redis 的string类型都支持哪些方法 或者从redis 中文文档查看 点我直接过去 相关的命令,就出现了 和bitmap 相关的有一下几个 setbit 使用说明:setbit key offset value key 就是你想设置的key offset 就是想设置的下标 value 就是你想设置的值,这里只能是0或者1 看下边的例子 首先我先setbit k1 1 1 那么保存到redis 后

一直在路上的博客 697

Redis-Bitmap位图及其常用命令详解

Bitmap位图

喻师傅的学习笔记 5144

Redis 中 bitmap 的原理和使用

Redis 有5种数据类型,而 BitMap 在 Redis 中并不是一个新的数据类型,其底层是 Redis 实现。

Java Punk 4617

手教你如何使用Simulink和相关工具箱模拟和实现无人机的多机接力信号中继的建模

扩大通信范围:单架无人机的通信能力有限,通过多机接力的方式可以显著扩展通信覆盖范围。提高可靠性:当某架无人机出现故障或电量不足时,其他无人机可以接管其任务,确保通信不中断。适应复杂环境:在山区、森林等复杂地形中,多机接力可以绕过障碍物,建立稳定的通信链路。使用Communications Toolbox中的模块来模拟无线通信链路。例如,可以使用模块模拟噪声信道,或者使用模块计算信号衰减。matlab深色版本。

MHD0815的博客 766

Redis的五种常用数据类型、三种特殊数据类型详解

目录简述Redis五种基本数据类型String字符串常用命令应用场景Hash散列表常用命令使用场景List链表常用命令应用场景Set( 集合)常用命令应用场景SortedSet( 有序集合) zset常用命令介绍应用场景Redis三种特殊的数据类型Geospatial 地理位置命令介绍底层实现原理Hyperloglog 基数统计命令介绍应用场景:适合做页面统计。Bitmap位图场景基本命令应用场景面试题常问的数据类型寄言 简述 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数

weixin_43246215的博客 4万+

海康读码器上位机开发避坑指南:IDMVS客户端之外,如何用C# SDK搞定扫码、数据比对与实时控制?

本文详细介绍了如何利用海康读码器的C# SDK进行二次开发,实现从基础扫码到复杂工业控制的全流程解决方案。内容涵盖SDK架构解析、多设备管理系统构建、业务逻辑与设备控制实现,以及系统集成与性能优化等关键环节,为工业自动化领域的开发者提供实用指南。

weixin_30642561的博客 550

Redis之bitmap

在我们的平常开发中,我们需要存储一些bool类型的值,比如用户在一年内的签到记录,一年有365天,如果我们用普通的key/value来进行存储的话,那么如果用户数量达到一个非常大的量级的话,这对于内存是一个巨大的消耗,所以在这样的场景下我们使用bitmap来存储的话,每一天的签到记录就只占一个位,那么一年的话就是365个bit(不到46个字节)。这里二进制表示的从左到右是高位到低位,我们分别看到字符a的二进制从左到右第1/2/7位为1,那我们设置一个第1位,第2位,第7位为1的bitmap来试一下。

weixin_43157245的博客 2433

《机器人学一(Robotics(1))》_台大林沛群 第 3 周 【机械手臂 顺运动学】Quiz 3

的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。bug 的图 要求解的 i 位置有误 两套 题目?B. 第2个 坐标系 的原点位置 不便于 计算;上面的正确,后两题 有误, 不知道问题在哪里。标准部分, 前面的更常用,这种仅作为 了解。还是计算过程中保留两位有效数字 不符合。2、确定 旋转角 α 正负的右手定则。1、确定坐标系方向的右手定则。可相交,距离为 0。A: 右手拇指指向。小数点后两位,不符合。

weixin_46034116的博客 1242

Rk3568 百兆以太网RMII模式DTS配置详解

本文详细解析了RK3568芯片在百兆以太网RMII模式下的DTS配置方法,包括时钟树配置、PHY接口模式定义及实际工程中的进阶设置。通过实战案例和调试技巧,帮助开发者快速解决RMII模式下的常见问题,提升工业控制设备的网络稳定性。

weixin_29189377的博客 420

【Redis】Redis中bitmap的原理和使用

bigmap 基于最小的单位bit进行存储,最大优势是非常省空间;设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的;二进制数据的存储,进行相关计算的时候非常快,也能方便扩容;不要给一个很短的 bigmap 设置很长位的偏移量的值,这样有可能堵塞。

DreamSun的博客 2299

低成本实现webhook接收端[python]

Webook本质上也是API,只不过是反向调用,即前端不主动发送请求,完全由后端推送。简单来说,Webhook是一个接受HTTP POST或是GET,PUT,DELETE的URL,一个实现了Webhook的API提供商就是在当事件发生的时候会向配置的URL发送信息,与请求-响应式不同,使用Webhook可以实时接收到变化。Ps:Webhook可能会发出大量的请求,确保接受的URL不被泄露或者应用能及时处理这些请求。

锡城小凯的博客 1万+

Redis的bitmap从基础到业务

编程界的小学生一、位与字节二、string与bitmap三、bitmap的api1、setbit2、bitpos3、bitcount4、bitop4.1、概述4.2、and4.3、or四、利用bitmap完成需求1、统计某用户登录天数2、查看活跃用户总数五、总结 一、位与字节 1个字节(byte)等于8个位(bit)。(计算机常识)。 二、string与bitmap Redis里的bitmap是属...

【原】编程界的小学生 4946

温度实时检测预警系统(STC89C51RC+DS18B20)

温度实时检测预警系统

1 兴趣 2 实践 1495

Linux LT8912b调试记录(MIPI转LVDS/HDMI)

本文记录了在RK3588平台上使用LT8912B芯片实现MIPI转LVDS/HDMI的调试过程。主要包含设备树配置、驱动代码实现及常见问题解决。调试重点包括:1)正确配置1280x800分辨率的LVDS屏幕参数;2)确保I2C总线正常通信;3)解决花屏、图像抖动、黑屏等问题,涉及lane-rate计算、同步信号极性调整及MIPI模式选择。文中提供了详细的寄存器配置代码和故障排查方法,特别强调了I2C通信验证和电压匹配的重要性。通过参数优化和多种模式测试,最终实现了稳定的视频输出转换。

qq_45147279的博客 1086

Redis中3种特殊的数据类型(BitMap、Geo和HyperLogLog)

转自https://www.jb51.net/article/136322.htm 这篇文章主要给大家介绍了关于Redis中3种特殊的数据类型(BitMap、GEOADD和GEODIST)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。 前言 Reids 在 Web 应用的开发中使用非常广泛,几乎所有的后端技术...

混血王子的博客 1952

PCIe协议之 Equalization篇 之 理论篇 之 FFE

作为最后一道“精加工”工序,DFE利用其不放大噪声的优势,精准地消除残余的、强烈的后光标ISI,最终得到一个非常干净、张得很开的眼图,供判决器使用。信号经过信道衰减后变得模糊,首先由CTLE进行“粗调”,提供一个宽频带的增益,将眼图初步打开,为后面的DFE创造一个可以正常工作的信号环境。,它通过将输入信号在不同时间点上的多个副本(称为“抽头”)进行加权求和,来直接塑造或“整形”输出信号的波形。:这是最主要的信号路径,通常系数为正值,决定了信号的幅度。:将所有加权后的信号相加,产生最终的均衡输出。

那么菜的博客 752

【Redis原理】Redis基本数据类型及其原理

Redis支持多种数据类型,各有特点及应用场景:String(字符串)可存储文本、数字或二进制数据,适用于缓存、计数和简易分布式锁;List(列表)按插入顺序存储元素,适合最新动态展示和简单消息队列;Hash(哈希表)存储键值对,用于对象数据存储;Set(集合)存储唯一元素,支持集合运算,适用UV统计和好友推荐;Zset(有序集合)按分值排序,适合排行榜和优先级队列;BitMap(位图)通过二进制位节省空间,适用于签到统计和用户在线状态。

gadiaola的博客 2161

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Redis7学习日记】—— Redis十大数据类型

包含Redis的十大类型与相关的常用命令

欢迎来到我的世界 6586

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Redis Bitmap介绍和使用场景

Redis 的 Bitmap(位图)是一种特殊的字符串数据类型,它利用字符串类型键(key)来存储一系列连续的二进制位(bits),每个位可以独立地表示一个布尔值(0 或 1),因此也只有两种状态。其底层实现仍是基于 String 类型。

李习的博客 2020

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Redis中的bitmap

Redis从2.2.0版本开始新增了setbit,getbit,bitcount等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit等命令只不过是在set上的扩展。 相关指令: SETBIT key offset value getbit key offset value bitcount key offset value # 对 key [key ...] 作位运算,并将结果存到 destkey BITOP AND/OR/NOT/XOR destkey key [k

ZERO 480

Redis 3 种特殊数据类型

根据官网介绍:Bitmap 不是 Redis 中的实际数据类型,而是在 String 类型上定义的一组面向位的操作,将其视为位向量。由于字符串是二进制安全的块,且最大长度为 512 MB,它们适合用于设置最多 2^32 个不同的位。Bitmap 存储的是连续的二进制数字(0 和 1),通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身。我们知道 8 个 bit 可以组成一个 byte,所以 Bitmap 本身会极大的节省储存空间。

Mr.W的博客 1188

Redis BitMap 总结

BitMap是什么 Bitmap(即Bitset)     Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。 Redis中的BitMap Redis从2.2.0版本开始新增了setbit,getbit,bitcount等几个bitmap相关命令。虽然是新命令,但是并没...

fenggj19870的专栏 4417

Redis数据类型概览:除了五大基础类型还有哪些?

当开发者谈论 Redis 时,脑海中首先浮现的往往是那五种经典的数据结构:String、List、Hash、Set 和 Sorted Set。它们构建了 Redis 作为高性能缓存和数据存储的基石,以其简洁和高效征服了无数应用场景。然而,随着现代应用程序的日益复杂——从实时消息流、LBS(基于位置的服务)应用到海量用户行为分析——我们面临的挑战也早已超出了这五种经典结构的范畴。真正的 Redis 大师深知,它的强大远不止于此。

2301_80863610的博客 6001
上一篇: Redis常用命令
下一篇: 在百万keys的Redis里面,如何模糊查找某个key.(keys和scan怎么用)
涵冰...
博客等级 码龄4年 2438粉丝 243原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涵冰...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值