redis bitmap数据类型调研

news2025/5/13 7:19:22
一、bitmap是什么?

redis原文:

Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type . This means that bitmaps can be used with string commands, and most importantly with SET and GET.

翻译过来是:

位图不是一种实际的数据类型,而是在String类型上定义的一组面向位的操作(有关更多信息,请参阅数据类型简介页面的“位图”部分)。这意味着位图可以用于字符串命令,还可以用SET和GET命令来进行操作。

二、bitmap有哪些优势?

Bitmap的优势在于其基于最小的单位bit进行存储,非常节省空间。设置和读取操作的时间复杂度为O(1),即非常快速。此外,二进制数据的存储和计算也非常快,适合用于需要高速读写和统计的操作‌。

三、bitmap能存储多大?

官方文档介绍,bitmap能操作的最大偏移量是2^32,所以这里也限制了bitmap的最大容量为512MB,而且最后设置的位如果快到了2的32次方,那么就可能会存在阻塞的情况,下面是官方文档的原文

When key does not exist, a new string value is created. The string is grown to make sure it can hold a bit at offset. The offset argument is required to be greater than or equal to 0, and smaller than 2^32 (this limits bitmaps to 512MB). When the string at key is grown, added bits are set to 0.

Warning: When setting the last possible bit (offset equal to 2^32 -1) and the string value stored at key does not yet hold a string value, or holds a small string value, Redis needs to allocate all intermediate memory which can block the server for some time. On a 2010 MacBook Pro, setting bit number 2^32 -1 (512MB allocation) takes ~300ms, setting bit number 2^30 -1 (128MB allocation) takes ~80ms, setting bit number 2^28 -1 (32MB allocation) takes ~30ms and setting bit number 2^26 -1 (8MB allocation) takes ~8ms. Note that once this first allocation is done, subsequent calls to SETBIT for the same key will not have the allocation overhead。

四、bitmap应用场景
1. 用户签到

可以使用 Bitmap 来记录用户的签到情况,每个用户作为键名,每天的日期对应一个位。若用户签到,就将对应的位置为 1;若未签到,则置为 0。通过这种方式,能够方便地统计用户的签到次数、连续签到天数等信息。

2. 在线状态统计

记录用户的在线状态,每个用户对应一个位,若用户在线,就将对应的位置为 1;若离线,则置为 0。这样可以快速统计当前在线的用户数量。

五、bitmap常用命令有哪些? 

 官网命令介绍

Commands | Docshttps://redis.io/docs/latest/commands/?group=bitmap

1. SETBIT
  • 功能:设置指定键的 Bitmap 中指定偏移量的位的值。
  • 语法SETBIT key offset value
  • 示例
SETBIT user_sign:20250507 10 1

这个命令将 user_sign:20250507 这个键对应的 Bitmap 中偏移量为 10 的位的值设置为 1。

返回值:该位设置之前的值。 offset从1开始。

2. GETBIT
  • 功能:获取指定键的 Bitmap 中指定偏移量的位的值。
  • 语法GETBIT key offset
  • 示例
GETBIT user_sign:20250507 10

这个命令会返回 user_sign:20250507 这个键对应的 Bitmap 中偏移量为 100 的位的值。

3. BITCOUNT
  • 功能:统计指定键的 Bitmap 中值为 1 的位的数量。
  • 语法BITCOUNT key [start end]
  • 示例
BITCOUNT user_sign:20250507

这个命令会统计 user_sign:20250507 这个键对应的 Bitmap 中值为 1 的位的数量。

4. BITOP
  • 功能:对一个或多个 Bitmap 进行位运算(如 AND、OR、XOR、NOT),并将结果存储在指定的键中。
  • 语法BITOP operation destkey key [key ...]
  • 示例
BITOP AND result user_sign:20250506 user_sign:20250507

这个命令会对 user_sign:20250506 和 user_sign:20250507 这两个键对应的 Bitmap 进行按位与运算,并将结果存储在 result 这个键中。

5. BITPOS
  • 功能:查找指定键的 Bitmap 中第一个值为指定值(0 或 1)的位的偏移量。
  • 语法BITPOS key bit [start [end]]
  • 示例:
BITPOS user_sign:20250507 1

这个命令会查找 user_sign:20250507 这个键对应的 Bitmap 中第一个值为 1 的位的偏移量。

6. BITFIELD

Redis 的 BITFIELD 命令提供了一种强大且灵活的方式来操作位图(bitmap)。它允许你在单个命令中对一个或多个位域(bit field)进行操作,包括获取和设置指定位域的值,支持不同的编码方式(如有符号整数和无符号整数),还能处理溢出情况。这使得 BITFIELD 非常适合处理复杂的位操作需求,例如处理用户的多个状态标志或者进行高效的数值存储。

详见官网或者豆包。

7. BITFIELD_RO

BITFIELD_RO 是 Redis 中用于操作位图(bitmap)的只读命令。与 BITFIELD 命令类似,它允许你从位图中获取指定位域(bit field)的值,支持以不同的数据类型(如无符号整数、有符号整数)来解释这些位域。不过,BITFIELD_RO 只能用于读取操作,不能进行写入操作(如设置位域的值、增加位域的值等),这使得它在只需要获取位图信息而不修改位图的场景下使用,能避免意外的数据修改。

详见官网或者豆包。

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

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

相关文章

LabVIEW 2019 与 NI VISA 20.0 安装及报错处理

在使用 Windows 11 操作系统的电脑上,同时安装了 LabVIEW 2019 32 位和 64 位版本的软件。此前安装的 NI VISA 2024 Q1 版,该版本与 LabVIEW 2019 32 位和 64 位不兼容,之后重新安装了 NI VISA 20.0。从说明书来看,NI VISA 20.0 …

探索 JWT(JSON Web Token):原理、结构与实践应用对比

目录 前言1. 什么是 JWT?2. JWT 的组成结构详解2.1 Header(头部)2.2 Payload(负载)2.3 Signature(签名) 3. JWT 的实际作用3.1 身份认证3.2 信息传递与授权 4. JWT 与 Cookie、API Key 的比较4.…

[docker基础一]docker简介

目录 一 消除恐惧 1) 什么是虚拟化,容器化 2)案例 3)为什么需要虚拟化,容器化 二 虚拟化实现方式 1)应用程序执行环境分层 2)虚拟化常见类别 3)常见虚拟化实现 一)主机虚拟化(虚拟机)实现 二)容器虚拟化实现 一 消除恐…

Texify - 数学公式OCR转换工具

文章目录 一、项目概览相关资源核心特性 二、安装指南三、使用示例1、命令行转换2、Python API调用3、交互式应用 四、性能基准运行你自己的基准测试 五、局限性 一、项目概览 Texify 是一个OCR模型,可将包含数学公式的图片或PDF转换为Markdown和LaTeX格式&#xf…

RISC-V CLINT、PLIC及芯来ECLIC中断机制分析 —— RISC-V中断机制(一)

在长期的嵌入式开发实践中,对中断机制的理解始终停留在表面层次,特别当开发者长期局限于纯软件抽象层面时,对中断机制的理解极易陷入"知其然而不知其所以然"的困境,这种认知的局限更为明显;随着工作需要不断…

开源与商业:图形化编程工具的博弈与共生

一、开源生态的破局之路:从技术实验到行业标准 在 2025 年全球开发者生态大会上,iVX 凭借 “全栈代码生成 AI 驱动开发” 的技术架构,被行业权威机构评选为 “年度技术创新典范”。作为 2012 年启动的开源项目,iVX 历经 17 年技…

(二)Linux下基本指令 2

【知识预告】 16. date 指令 17. cal 指令 18. find 指令 19. which指令 20. whereis 指令 21. alias 指令 22. grep 指令 23. zip/unzip 指令 24. tar 指令 25. bc 指令 26. uname ‒r 指令 27. 重要的⼏个热键 28. 关机 16 date 指令 指定格式显⽰时间:date %Y-…

无线网络设备中AP和AC是什么?有什么区别?

无线网络设备中AP和AC是什么?有什么区别? 一. 什么是AP?二. 什么是AC?三. AP与AC的关系 前言 肝文不易,点个免费的赞和关注,有错误的地方请指出,看个人主页有惊喜。 作者:神的孩子都…

Web自动化测试入门详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从业者的首选学习对象,相较于C/S架…

uniapp+vue3+firstUI时间轴 提现进度样式

展示 说明&#xff1a;“status”: 0, //状态:0待审核,1审核通过,2审核驳回,3提现成功,4提现失败 第一种&#xff1a;5种类型归纳为三种显示样式 <fui-timeaxis background"#fff" :padding"[10rpx,16rpx,0]"><!-- 动态生成步骤节点 --><f…

【日撸 Java 三百行】Day 10(综合任务 1)

目录 Day 10&#xff1a;综合任务 1 一、题目分析 1. 数据结构 2. 相关函数基本知识 二、模块介绍 1. 初始化与成绩矩阵的构建 2. 创建总成绩数组 3. 寻找成绩极值 三、代码与测试 小结 拓展&#xff1a;关于求极值的相关算法 Day 10&#xff1a;综合任务 1 Task&…

macOS 15.4.1 Chrome不能访问本地网络

前言 最近使用macmini m4&#xff0c;自带macOS15系统&#xff0c;对于开发者简直是一言难尽&#xff0c;Chrome浏览器的本地网络有bug&#xff0c;可以访问本机&#xff0c;但是不能访问路由器上的其他机器&#xff0c;路由器提供的页面也不能访问&#xff0c;如下是折腾解决…

【Hive入门】Hive增量数据导入:基于Sqoop的关系型数据库同步方案深度解析

目录 引言 1 增量数据导入概述 1.1 增量同步与全量同步对比 1.2 增量同步技术选型矩阵 2 Sqoop增量导入原理剖析 2.1 Sqoop架构设计 2.2 增量同步核心机制 3 Sqoop增量模式详解 3.1 append模式&#xff08;基于自增ID&#xff09; 3.2 lastmodified模式&#xff08;基…

Dify使用总结

最近完成了一个Dify的项目简单进行总结下搭建服务按照官方文档操作就行就不写了。 进入首页之后由以下组成&#xff1a; 探索、工作室、知识库、工具 探索&#xff1a; 可以展示自己创建的所有应用&#xff0c;一个应用就是一个APP&#xff0c;可以进行测试使用 工作室包含…

MATLAB导出和导入Excel文件表格数据并处理

20250507 1.MATLAB使用table函数和writetable函数将数据导出Excel表格文件 我们以高斯函数为例子&#xff0c;高斯函数在数学和工程领域有着广泛的应用&#xff0c;它的一般形式为&#xff1a; 其中是均值&#xff0c;决定了函数的中心位置&#xff1b; 是标准差&#xff0c;决…

分书问题的递归枚举算法

分数问题的递归枚举算法 一、问题引入二、解题步骤1.问题分析思维导图2.解题步骤 三、代码实现1.代码2.复杂度分析 四、个人总结 一、问题引入 分书问题是指&#xff1a;已知 n 个人对 m 本书的喜好&#xff08;n≤m&#xff09;&#xff0c;现要将 m 本书分给 n 个人&#xf…

Unity WebGL、js发布交互

官网参考 Unity3D开发之WebGL平台上 unity和js前端通信交互 WebFun.jslib mergeInto(LibraryManager.library, {JSLog: function (str) { var strsUTF8ToString(str); Log(str); Log(strs);}, Hello: function () {var strs"Hello, world!"; Log(strs); Log(UTF8ToS…

Linux复习笔记(一)基础命令和操作

遇到的问题&#xff0c;都有解决方案&#xff0c;希望我的博客能为你提供一点帮助。 一、Linux中的基础命令和操作&#xff08;约30%-40%) 1.用户和组&#xff08;5%左右&#xff09; 1.1用户简介&#xff08;了解&#xff09; 要求&#xff1a;了解&#xff0c;知道有三个用户…

uniapp使用ui.request 请求流式输出

正文&#xff1a; 在现代Web开发中&#xff0c;实时数据流和长时间运行的请求变得越来越常见&#xff0c;尤其是在处理大量数据或进行实时通信时。在这种情况下&#xff0c;uniapp 提供的 ui.request 请求方法可以帮助我们轻松实现流式输出请求。本文将介绍如何使用 uni.reques…

20250506让NanoPi NEO core开发板使用Ubuntu core16.04系统的TF卡启动

1、h3-sd-friendlycore-xenial-4.14-armhf-20210618.img.gz 在WIN10下使用7-ZIP解压缩/ubuntu20.04下使用tar 2、Win32DiskImager.exe 写如32GB的TF卡。【以管理员身份运行】 3、TF卡如果已经做过会有3个磁盘分区&#xff0c;可以使用SD Card Formatter/SDCardFormatterv5_WinE…