一、基本用法

任何一门程序语言都离不开位运算这个功能,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的位置,startend表示字符的开始和结束位置。

二、使用示例

以字符串maqian 为示例,对应的ASCII码和二进制位如下所示:

对redis而言,它不会和我们一样给每个字符一一对应到二进制数据,对计算机而言,它能看到的就是图中第三行的数据。

2.1 获取比特

name设置值为maqian,获取前8个字节分别对应m的比特位:

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获取这个值:

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

127.0.0.1:6379> setbit name 6 1
(integer) 0
127.0.0.1:6379> get name
"oaqian"

2.4 逻辑操作

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的位置

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
最后修改:2020 年 02 月 01 日
如果觉得我的文章对你有用,请随意赞赏