关于位图Bitmaps的介绍

article/2025/7/16 20:35:13

目录

1、基本概念

1.1、介绍

1.2、关键字

1.3、结构原理

2、常用命令

2.1、SETBIT

2.2、GETBIT

2.3、BITCOUNT

2.4、BITOP

2.5、BITPOS

3、应用场景

4、使用示例


前言

        Redis的Bitmaps是一种基于字符串的数据结构,用于处理位级别的操作。

        Bitmaps在Redis中并不是一种独立的数据类型,而是基于字符串实现的,但它们提供了高效的位操作功能,适用于需要处理大量布尔值或二进制数据的场景。


1、基本概念

1.1、介绍

        Bitmaps(位图) 是一种高效的数据结构,通过二进制位(bit)来表示数据的存在性或状态。每个 bit 可以存储一个二元状态(0 或 1),通常用于表示布尔型数据(如是否在线、是否注册等)。

        其核心优势是空间效率极高,常用于需要处理大规模二元数据的场景。

1.2、关键字

位图(Bitmaps)

        可以将其视为一个以位为单位的数组。

位(Bit)

        Bitmaps中的每个元素都是一个位,值为0或1。

偏移量(Offset)

        每个位都有一个唯一的偏移量(索引),从0开始,并且可以通过命令对这些bit进行设置、清除或者查询等操作。

字符串存储

        Bitmaps实际上是一个字符串,每个字节包含8个位。

1.3、结构原理

如下图所示:


2、常用命令

2.1、SETBIT

setbit:设置指定偏移量的位的值(0或1)。

SETBIT key offset valuesetbit mybitmap 0 1  # 设置第0位为1
setbit mybitmap 1 0  # 设置第1位为0

使用:

127.0.0.1:6379> setbit k5 1 1
(integer) 0127.0.0.1:6379> setbit k5 7 1
(integer) 0127.0.0.1:6379> setbit k5 9 1
(integer) 0127.0.0.1:6379> setbit k5 14 1
(integer) 0127.0.0.1:6379> get k5
"AB"

如下图所示:

2.2、GETBIT

getbit:获取指定偏移量的位的值。

语法:

GETBIT key offsetgetbit mybitmap 0  # 获取第0位的值

示例:

127.0.0.1:6379> getbit k5 1
(integer) 1

2.3、BITCOUNT

bitcount:统计指定字节数范围内值为1的位的数量。

语法:

BITCOUNT key [start end]bitcount mybitmap  # 计算整个位图中1的位数
bitcount mybitmap 0 1  # 计算从第0位到第1位中1的位数
127.0.0.1:6379> bitcount k5 0 1
(integer) 4127.0.0.1:6379> bitcount k5 0 0
(integer) 2

这里的start和end是指的字节数,而不是二进制位数。

2.4、BITOP

bitop:对多个Bitmaps进行位运算(AND、OR、XOR、NOT),并将结果存储到目标Bitmaps中。

语法:

BITOP operation destkey key [key ...]

127.0.0.1:6379> set k8 A
OK127.0.0.1:6379> set k9 B
OK# k8和k9逻辑并,并将结果保存到and89
127.0.0.1:6379> bitop and and89 k8 k9
(integer) 1127.0.0.1:6379> get and89
"@"# k8和k9逻辑或,并将结果保存到or89
127.0.0.1:6379> bitop or or89 k8 k9
(integer) 1127.0.0.1:6379> get or89
"C"# k8和k9逻辑异或,并将结果保存到xor89
127.0.0.1:6379> bitop xor xor89 k8 k9
(integer) 1127.0.0.1:6379> get xor89
"\x03"# 对k8逻辑非,只能接受一个key
127.0.0.1:6379> bitop not not8 k8
(integer) 1127.0.0.1:6379> get not8
"\xbe"

2.5、BITPOS

bitpos:查找指定范围内第一个值为0或1的位的位置。

语法:

BITPOS key bit [start] [end]bitpos mybitmap 1  # 查找第一个值为1的位的位置
bitpos mybitmap 0  # 查找第一个值为0的位的位置

127.0.0.1:6379> bitpos k5 1
(integer) 1127.0.0.1:6379> bitpos k5 0
(integer) 0

3、应用场景

用户在线状态:

        使用Bitmaps记录用户的在线状态,每个用户对应一个偏移量,值为1表示在线,值为0表示离线。

活跃用户统计:

        使用Bitmaps记录每天用户的活跃情况,每天对应一个Bitmap,统计一段时间内的活跃用户数量。

布隆过滤器:

        Bitmaps可以用于实现布隆过滤器,用于快速判断一个元素是否存在于集合中。

用户签到系统:

        可以用一个bit来代表一天内用户是否签到,一年只需要365bits即可记录用户的全年签到情况。

权限控制:

        在一个权限管理系统中,不同的权限点可以用不同的bit表示,然后通过检查对应的bit来判断用户是否有相应权限。

日志分析:

        对于一些特定的日志分析需求,如监控某段时间内的访问模式变化,也可以利用Bitmaps来进行有效跟踪。

数据去重:

        虽然直接用于去重可能不是最佳选择,但在某些情况下,如简单的IP地址过滤等小规模应用中,Bitmaps能够提供足够好的性能与资源消耗平衡。

⚠️注意事项:

        内存占用:位图的最大长度为512MB,即2^32个比特位。Bitmaps的内存占用取决于最大偏移量,而不是实际设置的位数。因此,如果偏移量非常大,可能会占用较多内存。

在设计时应考虑实际业务需求及潜在的数据增长趋势,以避免因单个key过大而导致的问题。

性能:Bitmaps 的位操作非常高效,适合处理大规模数据。

总结


4、使用示例


设置用户在线状态

SETBIT online_users 1001 1
SETBIT online_users 1002 0

获取用户在线状态

GETBIT online_users 1001  # 返回 1
GETBIT online_users 1002  # 返回 0

统计在线用户数量

BITCOUNT online_users  # 返回 1

代码示例:

package com.morris.redis.demo.bitmaps;import org.redisson.Redisson;
import org.redisson.api.RBitSet;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;/*** redisson中bitmaps的使用*/
public class RedissonBitmapsDemo {public static void main(String[] args) {// 配置Redisson客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 创建Redisson客户端实例RedissonClient redisson = Redisson.create(config);// 表示用户2099年01月的签到记录。RBitSet bitSet = redisson.getBitSet("user:sign:209901");// 设置第5位为true(用户第5天签到)bitSet.set(5, true);// 设置第10位为false(用户第10天未签到)bitSet.set(10, false);// 设置多个位的值(第20天到第25天都签到了)bitSet.set(20, 25, true);// 获取第五天是否签到boolean isSigned = bitSet.get(5); // 返回 trueSystem.out.println("the five day is sign: " + isSigned);// 本月总签到天数long signedDays = bitSet.cardinality();System.out.println("total sign days: " + signedDays); // 6RBitSet andResult = redisson.getBitSet("user:sign:and");andResult.and("user:sign:209901", "user:sign:209902");RBitSet orResult = redisson.getBitSet("user:sign:or");orResult.and("user:sign:209901", "user:sign:209902");RBitSet xorResult = redisson.getBitSet("user:sign:and");xorResult.and("user:sign:209901", "user:sign:209902");redisson.shutdown();}
}

总结:

        Bitmaps 是二进制数据处理的核心工具,其高效的空间利用率和快速的位操作使其在大数据、分布式系统等领域不可或缺。选择位图时需权衡场景需求(如是否需要精确性、动态扩展性),并结合压缩技术(如 Roaring Bitmaps)应对大规模数据挑战。


参考文章:

1、【redis】数据类型之bitmaps_redis的bitmaps-CSDN博客


http://www.hkcw.cn/article/JWGNZXSmYD.shtml

相关文章

【软件设计】通过软件设计提高 Flash 的擦写次数

目录 0. 个人简介 && 授权须知1. Flash 和 EEROM 基本情况2. 场景要求3. 软件设计思路4. 代码展示4.1 flash.h4.2 flash.c 0. 个人简介 && 授权须知 📋 个人简介 💖 作者简介:大家好,我是喜欢记录零碎知识点的菜鸟…

C 语言练习--初级

#学习C 代码, 做小练习时,自己运行代码竟然发现很多错误,记录一下。 1、计算器 根据输入的数值和符合,输出相应结果。 结果: #include "stdio.h"int Primary_math(int a, int b, char sign){int num0;swit…

pikachu通关教程-CSRF XSS

XSS XSS漏洞原理 XSS被称为跨站脚本攻击(Cross Site Scripting),由于和层叠样式表(Cascading Style Sheets,CSS)重名,改为XSS。主要基于JavaScript语言进行恶意攻击,因为js非常灵活…

E. Melody 【CF1026 (Div. 2)】 (求欧拉路径之Hierholzer算法)

E. Melody 思路 将所有出现过的音量和音高看作一个点,一个声音看作一条边,连接起来。那么很容易知道要找的就是图上的一条欧拉路径(类似一笔画问题) 又已知存在欧拉路径的充要条件为:度数为奇数的点的个数为0或者2个…

历年中国科学技术大学计算机保研上机真题

2025中国科学技术大学计算机保研上机真题 2024中国科学技术大学计算机保研上机真题 2023中国科学技术大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school?classification1 拆分数字 题目描述 给定一个数字,拆分成若干个数字之和&#xff…

2025陕西省赛补题

A 贪心 题意:给一个长度为n的序列,每次操作可以花费 w [ c [ i ] ] ( r − l 1 ) w[c[i]](r-l1) w[c[i]](r−l1)的代价,把区间 [ l , r ] [l,r] [l,r]染成染色 。 思路:对任意颜色,[l,r]中如果有cnt个连续的该颜色段…

Linux详谈进程地址空间

目录 第一谈:简单了解 第二谈:与操作系统的联系 内核空间与用户空间 步骤1:用户态代码执行 步骤2:跳转到内核代码 步骤3:内核代码访问用户数据 步骤4:返回到用户态 对于操作系统的本质:…

RabbitMQ vs MQTT:深入比较与最新发展

RabbitMQ vs MQTT:深入比较与最新发展 引言 在消息队列和物联网(IoT)通信领域,RabbitMQ 和 MQTT 是两种备受瞩目的技术,各自针对不同的需求和场景提供了强大的解决方案。随着 2025 年的到来,这两项技术都…

【Dify学习笔记】:Dify离线安装插件教程

Dify离线安装插件教程 1.本地下载插件 插件点击详情页面,安装右边的下载按钮,下载到本地 2.dify插件打包工具 dify-plugin-repackaging 下载后,进入到工具所在目录dify-plugin-repackaging/ git clone https://github.com/junjiem/dif…

2025年全国青少年信息素养大赛 scratch图形化编程挑战赛 小高组初赛 内部模拟试卷解析

2025年信息素养大赛初赛scratch模拟题 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】 scratch资料 Scratch3.0系列视频课程资料零基础学习scratch3.0【入门教学 免费】零基础学习scratch3.0【视频教程 114节 免费】 历届蓝桥杯scratch国赛真题解析历届蓝桥杯scratch…

eBest智能价格引擎系统 助力屈臣氏饮料落地「价格大脑」+「智慧通路」数字基建​

从价格策略到终端执行,数字化正在重构饮料行业竞争壁垒! 近日,eBest为屈臣氏饮料提供的智能价格引擎系统已正式上线并投入运营。同时,基于eBest SFA方案且与屈臣氏饮料业务场景深度耦合的Smart Field Operation智慧通路项目正式启…

开发效率提升小技巧:快速提取图标资源的解决方案

在日常使用电脑的过程中,我们经常会遇到想要提取某个软件图标的情况,比如用于美化桌面、制作快捷方式,或者个人收藏等。这一款高效又实用的图标提取工具,帮助你轻松获取软件中的图标资源! ResHacker 是一个绿色免安装…

keepalived定制日志bug

keepalived定制日志bug 源码安装apt安装endl 源码安装 在/etc/rsyslog.d/目录下创建 keepalived的日志配置文件keepalived.conf [rootubuntu24-13:~]# vim /etc/rsyslog.d/keepalived.conf [rootubuntu24-13:~]# cat /etc/rsyslog.d/keepalived.conf local6.* /var/log/keepa…

SpringCloud——Docker

1.命令解读 docker run -d 解释:创建并运行一个容器,-d则是让容器以后台进程运行 --name mysql 解释: 给容器起个名字叫mysql -p 3306:3306 解释:-p 宿主机端口:容器内端口,设置端口映射 注意: 1、…

2.测试项目启动和研读需求文档

软件质量需求 定义: 用于确定测试目标,反映用户对软件的要求分类依据: 分为功能和非功能两大类,其中非功能包含性能、界面等8个子类 软件质量需求的分类 功能需求: 软件能做什么的核心能力非功能需求: 性能:运行效率和资源占用界面&#xf…

在 Android 上备份短信:保护您的对话

尽管我们的Android手机有足够的存储空间来存储无数的短信,但由于设备故障、意外删除或其他意外原因,您可能会丢失重要的对话。幸运的是,我们找到了 5 种有效的 Android SMS 备份解决方案,确保您的数字聊天和信息保持安全且可访问。…

02业务流程的定义

1.要想用好业务流程,首先必须得了解流程与认识流程,什么是业务流程。在认识流程之前,首先要理清两个基本概念,业务和流程。 业务指的是:个人的或者摸个机构的专业工作。流程,原本指的是水的路程&#xff0…

PHP7+MySQL5.6 查立得源码授权系统DNS验证版

# PHP7MySQL5.6 查立得源码授权系统DNS验证版 ## 一、系统概述 本系统是一个基于PHP7和MySQL5.6的源码授权系统,使用DNS TXT记录验证域名所有权,实现对软件源码的授权保护。 系统支持多版本管理,可以灵活配置不同版本的价格和下载路径&#…

vue+threeJs 绘制3D圆形

嗨,我是小路。今天主要和大家分享的主题是“vuethreeJs 绘制圆形”。 今天找到一个用three.js绘制图形的项目,主要是用来绘制各种形状。 项目案例示意图 1.THREE.ShapeGeometry 定义:是 Three.js 中用于从 2D 路径形状&#xff08…

vue+threeJs 生成一个圆柱体

嗨,我是小路。今天主要和大家分享的主题是“vuethreeJs 生成一个圆柱体”。 案例示例图 1.CylinderGeometry 定义:创造一个圆柱体。 属性列表列表说明 radiusTop 顶部半径 radiusBottom 底部半径 height 高 radialSegments 横向分段&#xff…