Redis 位域

2022-06-20 19:45:41 浏览数 (2)

位域是指用一个字节中不同的二进制位表示不同的信息.

在存储信息时,并不需要占用一个完整的字节,而只需占一个或几个二进制位

位域典型应用场景是统计用户登录天数,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>

使用位域处理记录统计问题,会比直接存储节省很多空间,遇到类似可以优先考虑是否适用.

0 人点赞