开发者学堂课程【Redis 数据库入门:Redis_字符串建_BitMap 操作_3】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/15/detail/47
Redis_字符串建_BitMap 操作_3
内容介绍:
一、命令
二、位操作
一、命令
设置某一位上得值
- SETBIT key offset value
- Offset 偏移量,从0开始
- 获取某一位上得值
- GETBIT key offset
offset 偏移量后面跟 value 的值
在127.0.0.1:6379>SET temp 0b011设置 temp 键,二进制的011然后SETBIT temp 0,0的位置,就是第一个1的位置。将1的位置设置为默认值,因没有,所以要补全参数(ERR wrong number of argument for ‘setbit’ command)。
接着127.0.0.1:6379>SETBIT temp 0 1,在127.0.0.1:6379>SET temp 0b011这里,0已经是1,所以设置为1没有任何反应,返回( integer )0。接着127.0.0.1:6379>SETBIT temp 0 0,在0的位置设置为0,返回( integer )1,表示为设置好了。偏移量是从右开始,因为是二进制计数,所以从右开始。
接着127.0.0.1:6379> get temp,“0b011”没有变,返回客户端检查
代码如下:
r,set(‘testbin’,0b01100010)
print r, get(‘testbin’)
r,set(0b0011,0b01100011)
print r.get(0b0011)
print r.get(3)
print r.get(‘3’)
以上去还有待考证。
返回指定值0或者1在指定区间上第一次出现的位置
- BITPOS key bit [start] [end]
代码如下:
BITPOS key bit [start] [end]
summary: Find first bit set or clear in a string
since:2.8.7
group:string
以上后面在进行操作。
set str1 ab
setbit str1 6 1
setbit str1 7 0
get str1
这个结果是什么?
set str1 ab 这个例子表示操作 ab。
如果用二进制表示 ab,a为01100001,b 为01100010。将 ab 字符串值赋给 s1,如果进行 SETBIT 进行设置字符串对应的二进制。
观察是否有变化:
127.0.0.1:6379>set s1 ab
ok
127.0.0.1:6379>SETBIT s1 0 1
(integer)0
127.0.0.1:6379>get s1
“\xe1b”
127.0.0.1:6379>set s1 ab
ok
127.0.0.1:6379>SETBIT s1 -1 1
(error)ERR bit offset is not an integer or out of range(-1超出范围)
127.0.0.1:6379>SETBIT s1 0 1
(integer)0
127.0.0.1:6379>get s1
“\xe1b”
如果 ab 是二进制表示分别为01100001,01100010。如果进行 SETBIT 就是 out set为0的位置设为1,就显示为“\xe1b”的效果。无法显示字母。(就是学会将 ab 对应的二进制对应的位数进行设置)
接着再试 bitpos:
127.0.0.1:6379> set s1 ab
ok
127.0.0.1:6379>bitpos s1 1 0 -1 (1出现的位置,从开始到结束)
(integer)1
127.0.0.1:6379>bitpos s1 0 0 -1(bitpos,0在里面出现的第一个位置,)
(integer)0
0出现的位置是0,1出现的位置是1。对应的是a的二进制第一和第二位的位置。
二、位操作
1、operation 可以是AND(与)、OR(或)、NOT(非)、XOR(异或)这四种操作中的任意一种
统计指定位区间上值为1的个数 (BITCOUNT是用来统计二进制里1的个数)
BITCOUNT key [start] [end]
从左向右从0开始,从右向左从-1开始,注意官方start,end是位,测试后是字节
对于上图来说,首先设置ab是s1,然后 bitcount s1,进行数二进制里1的个数。1的个数为6个。
代码如下:
127.0.0.1:6379>set s1 ab
ok
127.0.0.1:6379>BITCOUNT s1
(integer)6
bitcount s1 0 0指的是开始和结束的区间范围里有多少个1。
2、Python 演示位操作
对3进行 bitcount 值为8。bitmap的下一个值是8,值得大小是8。3不是0b0011。因为 bitcount 是统计1的个数,这里3是 key,所以 bitcount 不是统计 key 上的1的个数,是统计 key 对应的 value 值上的1的个数。所以3对应的键等价于0b0011,0b01100011等价于99,所以 bitcount 的是99字符串上对应的的1。9所对应的二进制为10011001,
代码如下:
print r.bitcount(‘3’)(不是看3有多少位,是看3的键所对应的值有多少位)(用客户端写法比较产生误区,用命令就不容易产生误区,因为直接产生键,还有键所对应的值)
r.set(‘key1’,’a’)
r.set(‘key2’,’b’)
r.bitop(‘OR’,’key3’,’key1’,’key2’)
print r.get(‘key3’)
位数:
127.0.0.1:6379>help BITCOUNT
BITCUONT key [start] [end]
summary: count set bits in a string(有多少个位数)
since:2.6.0
group:string

