*Redis BITOP 命令
BITOP 在多个字符串(位图)之间执行按位运算(AND、OR、XOR、NOT),并将结果存储到目标 key。
*语法
BITOP operation destkey key [key ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| operation | String | 是 | 运算类型:AND、OR、XOR、NOT |
| destkey | String | 是 | 结果存储的目标键名 |
| key | String | 是 | 参与运算的源键名(NOT 只需 1 个,其他至少 2 个) |
*返回值
- Integer:结果字符串的字节长度
- Error:操作类型无效或 key 不是 String 类型
*时间复杂度
O(N),N 为参与运算的最长字符串的字节数
*示例
*OR 运算(合并位图)
> SET key1 "\x00\x01"
OK
> SET key2 "\x01\x00"
OK
> BITOP OR dest key1 key2
2
> GET dest
"\x01\x01"
*AND 运算(交集)
> SET key1 "\xff\x00"
OK
> SET key2 "\x00\xff"
OK
> BITOP AND dest key1 key2
2
> GET dest
"\x00\x00"
*NOT 运算(取反)
> SET key1 "\x00\xff"
OK
> BITOP NOT dest key1
2
> GET dest
"\xff\x00"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR syntax error | operation 不是 AND/OR/XOR/NOT | 检查运算类型拼写 |
| WRONGTYPE | 某个 key 不是 String 类型 | 检查源 key 的类型 |
| ERR BITOP NOT must be called with a single source key | NOT 传入了多个 key | NOT 只能对一个 key 操作 |
*最佳实践
- 位图交集/并集利器:用户标签系统常用 AND(交集)做精准筛选
- 不同长度的 key 参与运算时,较短的 key 会用 0 补齐
- 结果 key 的长度等于最长的源 key
- 大规模位图运算时注意内存和性能,必要时分批处理
- NOT 运算只能针对单个 key,如需多 key 取反需配合其他操作
*FAQ
Q1: BITOP 能处理不同长度的 key 吗? A: 能。较短的 key 会被视为在末尾补 0 对齐到最长 key 的长度。
Q2: BITOP 会修改源 key 吗? A: 不会。只读取源 key,结果写入 destkey。源 key 保持原样。
Q3: destkey 可以和源 key 相同吗? A: 可以。destkey 等于其中一个源 key 时,结果会覆盖该 key。但运算过程中仍基于原始值计算。