一、基本用法
任何一门程序语言都离不开位运算这个功能,redis 虽然不是一门编程语言,但也是一个和编程密切关联的工具。因此位运算自然也是 redis 中不可或缺的功能。
redis 中位运算相关的方法:
GETBIT key offset
:获取第 offset 位的 bit,不存的的比特位返回 0 。SETBIT key offset value
:给第 offset 位设置成 value 。BITCOUNT key [start] [end]
:计算 key 中 1 的个数。BITOP operation destkey key [key]
:执行位操作,位操作包含与 (AND)
、或 (OR)
、异或 (XOR)
以及非 (NOT)
。BITPOS key value [start] [end]
:查询key
中第一次出现value
的位置,start
和end
表示字符的开始和结束位置。
二、使用示例
以字符串 maqian
为示例,对应的 ASCII 码和二进制位如下所示:
对 redis 而言,它不会和我们一样给每个字符一一对应到二进制数据,对计算机而言,它能看到的就是图中第三行的数据。
2.1 获取比特
给 name
设置值为 maqian
,获取前 8 个字节分别对应 m
的比特位:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
127.0.0.1:6379> set name maqian OK 127.0.0.1:6379> getbit name 0 (integer) 0 127.0.0.1:6379> getbit name 1 (integer) 1 127.0.0.1:6379> getbit name 2 (integer) 1 127.0.0.1:6379> getbit name 3 (integer) 0 127.0.0.1:6379> getbit name 4 (integer) 1 127.0.0.1:6379> getbit name 5 (integer) 1 127.0.0.1:6379> getbit name 6 (integer) 0 127.0.0.1:6379> getbit name 7 (integer) 1 |
2.2 计算 1 的个数
maqian
字符串中 1 的个数为 5+3+4+4+3+5=24 个,可以使用 redis 获取这个值:
1 2 3 4 |
127.0.0.1:6379> bitcount name (integer) 24 127.0.0.1:6379> bitcount name 0 1 # 只计算前面两个字符 ma 中 1 的个数:5 + 3 = 8 (integer) 8 |
2.3 修改比特位
把第 m
的第六位变成 1,即相当于把 m 的 ascii 码+2,此时字符表示的是 o
:
1 2 3 4 |
127.0.0.1:6379> setbit name 6 1 (integer) 0 127.0.0.1:6379> get name "oaqian" |
2.4 逻辑操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
127.0.0.1:6379> set a a OK 127.0.0.1:6379> set b b OK 127.0.0.1:6379> bitop and dst a b # 与 (integer) 1 127.0.0.1:6379> get dst "`" 127.0.0.1:6379> bitop or dst a b # 或 (integer) 1 127.0.0.1:6379> get dst "c" 127.0.0.1:6379> bitop xor dst a b # 异或 (integer) 1 127.0.0.1:6379> get dst "x03" |
2.5 查询第一个 1 的位置
1 2 3 4 5 6 |
127.0.0.1:6379> set name maqian OK 127.0.0.1:6379> bitpos name 1 # 查询整个字符串第一个 1 的位置 (integer) 1 127.0.0.1:6379> bitpos name 1 2 3 # 查询第三个字符和第四个字符 qi 中第一次出现 1 的位置 (integer) 17 |
评论