暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis每日一练(10):BITOP和BITPOS命令

原创 AlbertS 2019-12-11
3726

版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议

前言

这两个命令之前好几天就在看了,不得不承认我已经老眼昏花了,把 BITIOP 看成了 BIT TOP,把 BITPOS 看成了 BIT TOPS,然后就认为 BITPOS 是 BITOP 的多参数形式,但是看文档内容两个命令没有什么关系啊,还查了半天 BIT TOP 是什么的缩写,看文档就是位操作没有什么特殊的啊,知道今天才发现看错了,BITOP 应该是 bit operation 的缩写,恍然大悟了。

BITOP

  • 最早出现版本:2.6.0
  • 时间复杂度:O(N)
  • 命令参数:BITOP operation destkey key [key …]
  • 操作类型:strings
  • 官方文档

作用

这个命令就是我们在其他语言中常说的位运算,按位与、按位或、按位取反等等,而在Redis中是通过 BITOP 命令实现的,有 AND、OR、XOR、NOT 四种操作,其中 NOT 只能有一个操作数,而其他三种可以有多个操作数。

练习

看一下基本的按位与操作,其他的应该也就明白了:

127.0.0.1:6379> SET key1 albert
OK
127.0.0.1:6379> SET key2 allay
OK
127.0.0.1:6379> BITOP AND resultkey key1 key2
(integer) 6
127.0.0.1:6379> GET resultkey
"al`ap\x00"
127.0.0.1:6379>

可能刚开始看到结果时有点蒙圈,两个字符串 albert 和 allay 按位与操作,前两个字符完全一致,按位与操作后不变,依旧是al,后面可能看不太懂,其实需要转化成二进制才能看出来,两个字符串按二进制显示,按位与操作后两个字符串对应的位都是1的在结果中才是1,其余的位都是0,结果就是:

"al`ap\x00"

BITPOS

  • 最早出现版本:2.8.7
  • 时间复杂度:O(N)
  • 命令参数:BITPOS key bit [start] [end]
  • 操作类型:strings
  • 官方文档

作用

BITPOS 的作用就是查找字符串的二进制表示中出现的第一个0或者1,参数中有start 和 end 两个参数,用来控制查找开始和结束的字节,如果不指定这两个参数,默认查找整个字符串,如果只传递了参数 start,那么默认从 start代表的字节查找到字符串末尾。

这个命令有一个奇怪的问题,就是查找0和1的处理过程有些不同,因为所有的字符串都可以认为在末尾有一个0,所以 BITPOS 命令在字符串中找1可能找不到,但是找0一定可以找得到,如果到末尾还没有找到0,则会返回末尾后一个位置,因为字符串默认结尾后面都是0,如果找1找不到就会返回-1。

练习

我们可以先找一个不存在的键试一下:

127.0.0.1:6379> GET key1
(nil)
127.0.0.1:6379> BITPOS key1 1
(integer) -1
127.0.0.1:6379> BITPOS key1 0
(integer) 0
127.0.0.1:6379>

从上面的测试来看,对于一个不存在的键,找0也是可以找到的。

设置查找的起始位置再调用一次 BITPOS 命令:

127.0.0.1:6379> SET mykey "\x00\xff\xf0"
OK
127.0.0.1:6379> BITPOS mykey 1 2
(integer) 16

从第二个字节开始查找第一位就找到了,这在整个字符串中就是第16位的位置,所以返回了16。

总结

  1. BITOP 实际上是 Redis 中的位运算的说明符,后面可以紧跟着位运算操作符 AND 、 OR 、 XOR 、 NOT 。
  2. BITPOS 返回字符串中的找到的第一个0或1的位置,注意找0和找1区别,0是肯定可以找到的,但是1可能找不到。

2019-12-1 21:03:29

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论