位域是指用一个字节中不同的二进制位表示不同的信息.
在存储信息时,并不需要占用一个完整的字节,而只需占一个或几个二进制位
位域典型应用场景是统计用户登录天数,setbit记录用来记录当天登录状态,bitcount统计登录总天数或者一段时间内登录天数.
1. 设置位域二进制值
setbit key index value
代码语言:javascript复制127.0.0.1:6379> setbit key 1 1
(integer) 1
127.0.0.1:6379> setbit key 2 1
(integer) 1
127.0.0.1:6379> getbit key 2
(integer) 1
127.0.0.1:6379> setbit key 7 1
(integer) 1
127.0.0.1:6379> getbit key 7
(integer) 1
127.0.0.1:6379> get key
"a"
位域对应值为如下二进制数组,而次二进制数组对应ascii码值是a,所以get命令结果为a;
每超过8位就用新的字符表示.
代码语言:javascript复制127.0.0.1:6379> setbit key 9 1
(integer) 0
127.0.0.1:6379> setbit key 10 1
(integer) 0
127.0.0.1:6379> setbit key 15 1
(integer) 0
127.0.0.1:6379> get key
"aa"
127.0.0.1:6379>
位域操作与set命令操作效果是一样的
代码语言:javascript复制127.0.0.1:6379> set key aa
ok
127.0.0.1:6379> getbit key 2
(integer) 1
127.0.0.1:6379> getbit key 1
(integer) 1
127.0.0.1:6379> getbit key 7
(integer) 1
127.0.0.1:6379>
2. 统计二进制数1的个数
bitcount key
代码语言:javascript复制127.0.0.1:6379> bitcount key
(integer) 6
3. 返回位图中第一个值为指定二进制值的位置
bitpos key bit [start] [end]
bitpos key 1
检测的字节范围为:[start, end)
代码语言:javascript复制127.0.0.1:6379> bitpos key 1
(integer) 1
127.0.0.1:6379> bitpos key 1 3 4
(integer) -1
127.0.0.1:6379> bitpos key 1 0 3
(integer) 1
127.0.0.1:6379> bitpos key 1 1 2
(integer) 9
4. 对一个或多个二进制位的字符串进行位操作,并将结果保存到新的key中.
bitop operation destkey key [key...]
operation可以是and,or,not,xor这四种操作中的任意一种
先准备2个位域数据
代码语言:javascript复制127.0.0.1:6379> set key1 "x60"
ok
127.0.0.1:6379> get key1
"`"
127.0.0.1:6379> set key2 "x20"
ok
127.0.0.1:6379> get key2
" "
127.0.0.1:6379>
4.1 对一个或者多个key进行逻辑并运算,并将结果保存到key3中
bitop and destkey key [key...]
key1二进制值为0110 0000
key2二进制值为0010 0000
" " 对应二进制值为0010 0000
代码语言:javascript复制127.0.0.1:6379> bitop and key3 key1 key2
(integer) 1
127.0.0.1:6379> get key3
" "
4.2 对一个或者多个key进行逻辑或运算,并将结果保存到key4中
bitop or destkey key [key...]
key1二进制值为0110 0000
key2二进制值为0010 0000
"`" 二进制值为0110 0000
代码语言:javascript复制127.0.0.1:6379> bitop or key4 key1 key2
(integer) 1
127.0.0.1:6379> get key4
"`"
4.3 对一个或者多个key进行逻辑异或运算,并将结果保存到key5中
bitop xor destkey key [key...]
key1二进制值为0110 0000
key2二进制值为0010 0000
"@"对应二进制值为0100 0000
代码语言:javascript复制127.0.0.1:6379> bitop xor key5 key1 key2
(integer) 1
127.0.0.1:6379> get key5
"@"
4.4 对给定key进行逻辑非运算,并将结果保存到key6中
bitop not destkey key
key1二进制值为0110 0000
"x9f"对应二进制值为1001 1111
代码语言:javascript复制127.0.0.1:6379> bitop not key6 key1
(integer) 1
127.0.0.1:6379> get key6
"x9f"
127.0.0.1:6379>
使用位域处理记录统计问题,会比直接存储节省很多空间,遇到类似可以优先考虑是否适用.