前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Redis 位域

Redis 位域

作者头像
一个架构师
发布2022-06-20 19:45:41
发布2022-06-20 19:45:41
34800
代码可运行
举报
运行总次数:0
代码可运行

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

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

位域典型应用场景是统计用户登录天数,setbit记录用来记录当天登录状态,bitcount统计登录总天数或者一段时间内登录天数.

1. 设置位域二进制值

setbit key index value

代码语言:javascript
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
127.0.0.1:6379> bitcount key
(integer) 6

3. 返回位图中第一个值为指定二进制值的位置

bitpos key bit [start] [end]

bitpos key 1

检测的字节范围为:[start, end)

代码语言:javascript
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
127.0.0.1:6379> bitop not key6 key1
(integer) 1
127.0.0.1:6379> get key6
"\x9f"
127.0.0.1:6379>

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从码农的全世界路过 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档