Redis中String类型之Bit命令的详解&Bit命令的实践

前面一节通过对Redis中的String的命令做了充分的讲解以及实践学习,接下来我们来学习bit相关的操作命令。开发中有时这些命令的使用会更优效率。


Redis中Bit常用的命令

Redis中字符串的存储方式都是以二进制的方式存储的。BIT命令就是对这个二进制数据进行操作的。

常用的Bit命令

备注说明

getbit

获取二级制中对应偏移量的值

setbit

设置对应二进制位的值

bitcount

统计二进制中为1的个数

bitop

对二进制数据做位元操作,与,或,非,异或操作

bitpos

返回字符串里面第一个被设置为1或者0的bit位

getbit命令

用于对 key 所对应的value的值,通过方法获取对应的二进制的值,获取指定偏移量上的位(bit)。
如果key不存在,返回0。
如果当偏移量 OFFSET 比字符串值的长度大,返回 0 。

127.0.0.1:6379> set ke1 value1
OK
127.0.0.1:6379> getbit ke1 0
(integer) 0
127.0.0.1:6379> getbit ke1 1
(integer) 1
127.0.0.1:6379> getbit ke1 2
(integer) 1
127.0.0.1:6379> getbit ke1 3
(integer) 1
127.0.0.1:6379> getbit ke1 4
(integer) 0
127.0.0.1:6379> getbit ke1 5
(integer) 1
127.0.0.1:6379> 6
(error) ERR unknown command `6`, with args beginning with: 
127.0.0.1:6379> getbit ke1 6
(integer) 1
127.0.0.1:6379> getbit ke1 7
(integer) 0
127.0.0.1:6379> getbit ke1 8
(integer) 0
127.0.0.1:6379> getbit ke1 9
(integer) 1
127.0.0.1:6379>

redis bitset用法 redis bit操作_redis bitset用法

setbit命令

用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit),返回的结果是该位上原来的bit值。比如我们设置 t1为a,t2为b,a对应的ASCII码为97(01100001),b对应的ASCII码为99(01100010),相差俩个1,如此我们就可以通过setbit来调整它的值,最后将结果返回,发现我们的t1由a变为b。

127.0.0.1:6379> set t1 a
OK
127.0.0.1:6379> set t2 b
OK
127.0.0.1:6379> get t1
"a"
127.0.0.1:6379> get t2
"b"
127.0.0.1:6379> setbit t1 6 1
(integer) 0
127.0.0.1:6379> setbit t1 7 0
(integer) 1
127.0.0.1:6379> get t1
"b"
127.0.0.1:6379> get t2
"b"
127.0.0.1:6379>

redis bitset用法 redis bit操作_linux_02

bitcount命令

用来统计二进制中为1的个数。

127.0.0.1:6379> bitcount b1
(integer) 8
127.0.0.1:6379> bitcount b2
(integer) 8
127.0.0.1:6379> bitcount b3
(integer) 9
127.0.0.1:6379> bitcount t1
(integer) 3
127.0.0.1:6379> bitcount t2
(integer) 3
127.0.0.1:6379> bitcount t3
(integer) 0
127.0.0.1:6379>

redis bitset用法 redis bit操作_bit命令_03

应用例子:(参考邓老师的博客~波波烤鸭)

实际使用官网给出了例子,统计在线人数

假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 A 上线了多少天,用户 B 上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加 beta 测试等活动 —— 这个模式可以使用 SETBIT 和 BITCOUNT 来实现。
比如说,每当用户在某一天上线的时候,我们就使用 SETBIT ,以用户名作为 key ,将那天所代表的网站的上线日作为 offset 参数,并将这个 offset 上的为设置为 1 。
举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。
当要计算 peter 总共以来的上线次数时,就使用 BITCOUNT 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。

性能

前面的上线次数统计例子,即使运行 10 年,占用的空间也只是每个用户 10*365 比特位(bit),也即是每个用户 456 字节。对于这种大小的数据来说, BITCOUNT 的处理速度就像 GET 和 INCR 这种 O(1) 复杂度的操作一样快。

BitOp命令

对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey —>(这个可以理解成存放结果的key)上。BITOP 命令支持 AND(与) 、 OR(或) 、 NOT(非) 、 XOR(异或)运算。

需要注意的是not运算注意参数个数

redis bitset用法 redis bit操作_bit命令_04

127.0.0.1:6379> set t1 a
OK
127.0.0.1:6379> set t2 z
OK
127.0.0.1:6379> bitop and t3 t1 t2
(integer) 1
127.0.0.1:6379> get t3
"`"
127.0.0.1:6379> bitop or t3 t1 t2
(integer) 1
127.0.0.1:6379> get t3
"{"
127.0.0.1:6379> bitop xor t3 t1 t2
(integer) 1
127.0.0.1:6379> get t3
"\x1b"
127.0.0.1:6379> bitop not t3 t1 t2
(error) ERR BITOP NOT must be called with a single source key.
127.0.0.1:6379> bitop not t1 t2
(integer) 1
127.0.0.1:6379> get t1
"\x85"
127.0.0.1:6379>

BitPos命令

返回字符串里面第一个被设置为1或者0的bit位。

127.0.0.1:6379> bitpos t1 1
(integer) 1
127.0.0.1:6379> bitpos t1 0
(integer) 0
127.0.0.1:6379>

redis bitset用法 redis bit操作_string_05