*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。但运算过程中仍基于原始值计算。