BITOP

对多个字符串进行按位运算,并存储结果。

语法

BITOP destkey key [key ...]

引入版本:2.6.0

复杂度摘要:O(N)

[!NOTE] 此命令的行为在集群 Redis 环境中有所不同。请参阅 多键操作 页面了解更多信息。

在多个键(包含字符串值)之间执行按位运算,并将结果存储到目标键中。

BITOP 命令支持 8 个按位操作:AND、OR、XOR、NOT、DIFF、DIFF1、ANDOR 和 ONE。调用该命令的有效形式是:

  • BITOP AND destkey srckey1 srckey2 srckey3 ... srckeyN

    仅当所有源位图中都设置了 destkey 中的位时,该位才会被设置。 * BITOP OR destkey srckey1 srckey2 srckey3 ... srckeyN

    仅当在至少一个源位图中设置了 destkey 中的一位时,该位才会被设置。 * BITOP XOR destkey srckey1 srckey2 srckey3 ... srckeyN

    通常与两个源位图一起使用,仅当两个源位图之间的值不同时,destkey 中的某个位才会被设置。 * BITOP NOT destkey srckey

    NOT 是一元运算符,仅支持单个源位图;将位设置为源位图中其值的倒数。 * BITOP DIFF destkey X [Y1 Y2 ...] 1

    如果在 X 中设置了 destkey 中的某个位,则该位被设置,但在 Y1, Y2, ... 中的任何一个中均未设置。 * BITOP DIFF1 destkey X [Y1 Y2 ...] 1

    如果在一个或多个 Y1, Y2, ... 中设置了 destkey 中的一位,但在 X 中未设置该位,则该位被设置。 * BITOP ANDOR destkey X [Y1 Y2 ...] 1

    如果在 X 以及 Y1, Y2, ... 中的一个或多个中设置了 destkey 中的一位,则该位也会被设置。 * BITOP ONE destkey X1 [X2 X3 ...] 1

    如果 X1, X2, ... 中的一位恰好被置位,则 destkey 中的一位也被置位。

每次操作的结果始终存储在destkey 中。

  1. Redis 8.2 新增 。

必需参数

operation

要执行的按位操作:AND、OR、XOR、NOT、DIFF、DIFF1、ANDOR 或 ONE。 NOT 只接受一个源键。

destkey

存储结果的key。

key [key ...]

一个或多个源键。

示例

  1. 使用 AND 运算符的基本用法示例:
redis> BITFIELD key1 SET i8 #0 255
1) (integer) 0
redis> BITFIELD key2 SET i8 #0 85
1) (integer) 0
redis> BITOP AND dest key1 key2
(integer) 1
redis> BITFIELD dest GET i8 #0
1) (integer) 85
  1. 假设您想让人们看到与书籍相关的广告。目标受众是喜欢读书并对奇幻、冒险或科幻小说感兴趣的人。假设您有以下位图:
  • LRB——爱读书的人。
  • B:F - 对幻想感兴趣的人。
  • B:A - 对冒险感兴趣的人。
  • B:SF——对科幻小说感兴趣的人。

要创建代表目标受众的位图,请使用以下命令:

BITOP ANDOR TA LRB B:F B:A B:SF

详细说明

不同长度字符串的处理

当在具有不同长度的字符串之间执行操作时,所有比集合中最长字符串短的字符串都被视为用零填充到最长字符串的长度。

对于不存在的键也是如此,它们被视为零字节流,直到最长字符串的长度。

模式:使用位图的实时指标

BITOP 是对 BITCOUNT 命令文档中记录的模式的良好补充。可以组合不同的位图以获得执行人口计数操作的目标位图。

有关有趣的用例,请参阅名为“使用 Redis 位图快速轻松地实现实时指标”的文章。

性能考虑

BITOP 是一个可能很慢的命令,因为它运行时间为 O(N)。针对长输入字符串运行时应小心。

对于涉及大量输入的实时指标和统计数据,一个好的方法是使用副本(启用副本只读选项),其中执行按位操作以避免阻塞主实例。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 标准
✅ 主动-主动
✅ 标准
✅ 主动-主动

返回值

RESP2

整数回复:存储在目标键中的字符串的大小等于最长输入字符串的大小。

RESP3

整数回复:存储在目标键中的字符串的大小等于最长输入字符串的大小。

资料来源:Redis 官方 BITOP 文档;中文内容参考 Redis 文档许可。