惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
罗磊的独立博客
The GitHub Blog
The GitHub Blog
L
LangChain Blog
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
DataBreaches.Net
宝玉的分享
宝玉的分享
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
N
Netflix TechBlog - Medium
The Cloudflare Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
美团技术团队
大猫的无限游戏
大猫的无限游戏
雷峰网
雷峰网
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog

Liu Zijian's Blog | 一个技术博客

使用Certbot自动续签HTTPS证书 使用Filebeat采集Nginx日志到ES Python的协程 Python中的异常 Python中的类和对象 Python的函数 Python的数据结构,推导式、迭代器和生成器 Spring AI集成多模态模型 LangChain4j多模态 LangChain Tools工具使用 Python中的模块和包 Python全局环境和虚拟环境(venv) LangChain Prompt提示词工程 LangChain4j Tools工具使用 基于Dify搭建AI智能体应用 LangChain4j RAG检索增强生成 Spring AI实现MCP Server Spring AI集成MCP Client LangChain4j Prompt提示词工程 Spring AI使用知识库增强对话功能 Spring AI实现一个智能客服 Spring AI实现一个简单的对话机器人 实现MinIO数据的每日备份 自己实现一个DNS服务 简单理解AI智能体 大模型和大模型应用 LangChain开篇 LangChain4j开篇 一个解析Excel2007的POI工具类 DataPermissionInterceptor源码解读
Redis数据结构之Bitmap
Liu Zijian · 2024-10-16 · via Liu Zijian's Blog | 一个技术博客

1.概述

  • 由0和1状态表现的二进制位的bit数组(数组里每个元素只能是0或1)该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。
  • 基于String数据类型的按位的操作。
  • Bitmap支持的最大位数是2³²位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2³²= 4294967296)

2.常见操作

2.1 SETBIT

设置0或1到Bitmap

SETBIT key offset value
  • key
  • offset 偏移位,从0开始计算
  • value 只能是0或1

例:

127.0.0.1:6379> setbit k1 1 1
(integer) 1
127.0.0.1:6379> setbit k1 2 1
(integer) 1
127.0.0.1:6379> setbit k1 3 1
(integer) 1

验证:Bitmap基于String数据类型的

127.0.0.1:6379> type k1
string

2.2 GETBIT

获取0或1,不是1就默认0

127.0.0.1:6379> getbit k1 1
(integer) 1
127.0.0.1:6379> getbit k1 2
(integer) 1
127.0.0.1:6379> getbit k1 3
(integer) 1
127.0.0.1:6379> getbit k1 4
(integer) 0

2.3 STRLEN

不是字符串长度而是Bitmap占据几个字节,按照8位一组扩容,统计有多少组

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

2.4 BITCOUNT

一个bitmap中从START到END有多少个1,不加START|END统计全部

BITCOUNT KEY [START|END]

例:

127.0.0.1:6379> bitcount k3
(integer) 3

2.5 BITOP

对bitmap进行二进制运算(与AND、或OR、非NOT、异或XOR)保存结果到DESTKEY KEY

BITOP AND|OR|NOT|XOR DESTKEY KEY [KEY ...]

例:

准备数据

127.0.0.1:6379> setbit bin1 0 1
(integer) 0
127.0.0.1:6379> setbit bin1 1 1
(integer) 0
127.0.0.1:6379> setbit bin1 2 0
(integer) 0
127.0.0.1:6379> setbit bin1 3 1
(integer) 0
127.0.0.1:6379> setbit bin2 0 0
(integer) 0
127.0.0.1:6379> setbit bin2 1 1
(integer) 0
127.0.0.1:6379> setbit bin2 2 1
(integer) 0
127.0.0.1:6379> setbit bin2 3 0

测试:BITOP AND

127.0.0.1:6379> BITOP AND bintemp bin1 bin2
(integer) 1

查看写入到bintemp中的结果

127.0.0.1:6379> getbit bintemp 0
(integer) 0
127.0.0.1:6379> getbit bintemp 1
(integer) 1
127.0.0.1:6379> getbit bintemp 2
(integer) 0
127.0.0.1:6379> getbit bintemp 3
(integer) 0

3.总结

命令 作用 时间复杂度
setbit 给指定key的值的第offset赋值val O(1)
getbit 获取指定key的第offset位 O(1)
bitcount 返回指定key中[start,end]中为1的数量 O(n)
bitop 对不同的二进制存储数据进行位运算(AND、OR、NOT、XOR) O(n)

使用场景:

1.统计签到、登录、打卡等,例如:ID为10001的用户2025年5月的第12个工作日未打卡

setbit sign:uid_10001:202505 12 0