赞
踩
在开发过程中,经常有一些bool型的值需要存储。
比如用户一年的签到记录,签了是1,没签是0。如果每个记录都用一个byte、short、int、boolean等基本类型结构去存储,那么占用的空间是很大的。
为了解决这个问题,Redis提供了位图结构,每个布尔记录只需要占用一个位,也就是一个bit。365天的签到记录只需要365位就可以存的下。
注意,位图并不是特殊的数据结构,它的内容就是普通的字符串内容。
8位bit对应一个字符,我们可以在BITCOUNT操作中,明显地看出来。
最常用的几个指令:
# 把当前key下的第offset位设置成value
SETBIT key offset value
# 获取指定key下的第offset位
GETBIT key offset
# 获取key中为1的计数,可加范围
# 注意 start和end的单位是字符
BITCOUNT key [start end]
# 查询在[strat, end]区间内,第一次出现bit值的坐标
BITPOS key bit [start end]
示例位数组:{ 0, 1, 0, 1, 1}
127.0.0.1:6379> SETBIT example 0 0
(integer) 0
127.0.0.1:6379> SETBIT example 1 1
(integer) 0
127.0.0.1:6379> SETBIT example 2 0
(integer) 0
127.0.0.1:6379> SETBIT example 3 1
(integer) 0
127.0.0.1:6379> SETBIT example 4 1
(integer) 0
示例位数组:{ 0, 1, 0, 1, 1}
127.0.0.1:6379> GETBIT example 2
(integer) 0
127.0.0.1:6379> GETBIT example 3
(integer) 1
127.0.0.1:6379> GETBIT example 4
(integer) 1
127.0.0.1:6379> GETBIT example 1
(integer) 1
示例数据 {0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1}
注意(1字符-8位)的对应
# 查看全局的BITCOUNT
127.0.0.1:6379> BITCOUNT example
(integer) 9
# 查看第一个字符的BITCOUNT,即前0位
127.0.0.1:6379> BITCOUNT example 0 0
(integer) 1
# 查看第二个字符的BITCOUNT,即后8位
127.0.0.1:6379> BITCOUNT example 1 1
(integer) 8
# 查看前两个字符的BITCOUNT,即0-15位
127.0.0.1:6379> BITCOUNT example 0 1
(integer) 9
示例数据 {0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1}
# 获得第一个出现1的下标
127.0.0.1:6379> BITPOS example 1
(integer) 7
# 获得[1,1](字符)内,第一个出现1的下标
127.0.0.1:6379> BITPOS example 1 1 1
(integer) 8
# 获得[1,1](字符)内,第一个出现0的下标,结果不存在
127.0.0.1:6379> BITPOS example 0 1 1
(integer) -1
# 获得[0,1](字符)内,第一个出现0的下标
127.0.0.1:6379> BITPOS example 0 0 1
(integer) 0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。