在上篇文章中介绍了String类型中常用的命令,但没有涉及到bit相关的命令,本文主要介绍下bit相关的操作命令。开发中有时这些命令的使用会更优效率。
Redis中字符串的存储方式都是以二进制的方式存储的。
比如:
127.0.0.1:6379> set k1 a OK
k1的值为a,对应的ascii码是97,转换为二进制就是01100001。BIT命令就是对这个二进制数据进行操作的。
命令 | 说明 |
getbit | 获取二级制中对应偏移量的值 |
setbit | 设置对应二进制位的值 |
bitcount | 统计二进制中位中为1的个数 |
bitop | 对二进制数据做位元操作,与,或,非,异或操作 |
bitpos | 返回字符串里面第一个被设置为1或者0的bit位 |
GetBit命令
用于对 key 所储存的字符串值,获取指定偏移量上的位(bit)
127.0.0.1:6379> set k1 a OK 127.0.0.1:6379> getbit k1 0 (integer) 0 127.0.0.1:6379> getbit k1 1 (integer) 1 127.0.0.1:6379> getbit k1 2 (integer) 1 127.0.0.1:6379> getbit k1 3 (integer) 0 127.0.0.1:6379> getbit k1 4 (integer) 0 127.0.0.1:6379> getbit k1 5 (integer) 0 127.0.0.1:6379> getbit k1 6 (integer) 0 127.0.0.1:6379> getbit k1 7 (integer) 1
当偏移量 OFFSET 比字符串值的长度大,或者 key 不存在时,返回 0 。
SetBit命令
用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit),返回的结果是该位上原来的bit值。比如我们设置 k1为a,k2为c,a对应的ASCII码为97(01100001),c对应的ASCII码为99(01100011),相差了一个1,如此我们就可以通过setbit来调整
127.0.0.1:6379> set k2 c OK 127.0.0.1:6379> get k1 "a" 127.0.0.1:6379> get k2 "c" 127.0.0.1:6379> setbit k1 6 1 (integer) 0 127.0.0.1:6379> get k1 "c"
如此我们就将k1的值快速调整为了c。
BitCount命令
用来统计二进制中为1的个数,比如a(97 01100001)为3,c(99 01100011)为4.
127.0.0.1:6379> get k1 "a" 127.0.0.1:6379> get k2 "c" 127.0.0.1:6379> bitcount k1 (integer) 3 127.0.0.1:6379> bitcount k2 (integer) 4
实际使用官网给出了例子,统计在线人数。
假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 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 上。BITOP 命令支持 AND(与) 、 OR(或) 、 NOT(非) 、 XOR(异或)运算。比如a 01100001和c 01100011进行相关运算
127.0.0.1:6379> get k1 "a" 127.0.0.1:6379> get k2 "c" 127.0.0.1:6379> bitop and k3 k1 k2 (integer) 1 127.0.0.1:6379> get k3 "a" 127.0.0.1:6379> bitop or k4 k1 k2 (integer) 1 127.0.0.1:6379> get k4 "c" 127.0.0.1:6379> bitop xor k5 k1 k2 (integer) 1 127.0.0.1:6379> get k5 "\x02"
not运算注意参数个数
127.0.0.1:6379> bitop not k6 k1 (integer) 1 127.0.0.1:6379> get k6 "\x9e"
BitPos命令
返回字符串里面第一个被设置为1或者0的bit位。
返回一个位置,把字符串当做一个从左到右的字节数组,第一个符合条件的在位置0,其次在位置8,等等。还是以a为例01100001
127.0.0.1:6379> bitpos k1 1 (integer) 1 127.0.0.1:6379> bitpos k1 0 (integer) 0
~好了本文到此为止