Bitmap(位图)
Bitmap(位图)
是一种基于字符串(String)
类型的特殊数据结构,通过二进制位(bit)
的数组形式存储数据,每个位只能为0
或1
。它适用于处理大规模二值状态
(如存在/不存在、是/否)的场景,具有极高的空间效率和快速位操作能力。其底层是基于String
类型实现的。
注:
Bitmap
的操作是原子性的, 适用于高并发场景, 时间复杂度为O(1)或O(N)Bitmap
支持使用位运算处理复杂逻辑处理
常用命令
SETBIT
设置指定 key
中偏移量对应的二进制位值, 返回值为操作前该位的原始值
语法:
SETBIT key offset value
参数:
offset
:位的偏移量(从 0 开始,最大支持 2^32-1,即约 42.9 亿位)。value
:值,仅允许 0 或 1。
注:首次设置大偏移量时,Redis 会预分配内存(如 512MB 对应偏移量 2^32-1),可能导致短暂阻塞
GETBIT
获取指定键中偏移量对应的二进制位值
语法:
GETBIT key offset
BITCOUNT
统计字符串(底层实现为 Bitmap)中二进制位值为 1
的总数量。不存在的 key
被视为空字符串,因此该命令将返回 0
。
语法:
BITCOUNT key [start end [BYTE | BIT]]
参数:
- BYTE: 默认,将
start
和end
解释为字节偏移量,每个字节包含 8 位。 - BIT: 将
start
和end
解释为位偏移量,直接定位到二进制位的具体位置。
BITTOP
在多个key
(包含字符串值)和之间执行按位操作 将结果存储在目标key
中。
-
AND(逻辑与)
所有输入位图中对应位均为1时,结果位为 1
典型场景:统计多日连续活跃用户, 如:
BITOP AND 7days_sign day1 day2...
-
OR(逻辑或)
任意输入位图中对应位为1时,结果位为 1
典型场景:合并多日活跃用户
BITOP OR week_activity day1 day2...
-
XOR(逻辑异或)
输入位图中对应位不同时,结果位为1
。
典型场景:检测用户行为差异(如新老用户行为对比)。 -
NOT(逻辑非)
对单个输入位图所有位取反。
典型场景:筛选未活跃用户(如)
BITOP NOT inactive_users active_users
语法:
BITOP <AND | OR | XOR | NOT> destkey key [key ...]
参数:
operation
:必选,支持AND
/OR
/XOR
/NOT
。destkey
:必选,存储运算结果的键名。key1 key2...
:参与运算的键(NOT
仅支持单键)。
较短字符串的缺失部分视为
0
,空键视为全0
序列若目标键
destkey
已存在,其原有内容会被覆盖;若不存在,Redis 会根据最长输入键预分配内存