项目开发过程中 ,数据我们经常会使用boolean类型来存储数据。结构例如记录用户每天签到,数据签到了是1 ,没签则为0,结构如果我们需要统计一年内的数据签到数,如果采用String来存储,结构需要每个用户都要记录 365次,数据当用户数量非常大时,结构需要的存储空间非常巨大 。为了解决这个问题,数据Redis提供了位图数据结构来解决此问题。结构
bitmap简称位图,数据是结构由多个二进制位组成的数组,数组中的数据每个二进制位都有与之对应的偏移量 ,可以通过这些偏移量对位图中指定的结构一个或多个二进制位进行操作 。
说明:位图也可以看作一个字节数组 ,索引序号代表对应的值 ,bitmap默认值都为0
setbit key offset valuen
注意 :设置bit值时 ,其中offset的值不能为负数,否则会报ERR bit offset is not integer or out of range错误 。
将位图mbit设置为:10010100
#设置第一个位置为1n setbit mbit 0 1 n #设置第四个位置为1n setbit mbit 3 1 n #设置第六个位置为1n setbit mbit 5 1 n
当用户执行setbit命令时,如果位图不存在,或者位图当前的大小无法满足用户想要执行的设置操作,那么Redis将对被设置的位图进行扩展 ,使得位图可以满足用户的设置请求。
例如用户执行如下命令 :
setbit mbit 10 1n
Redis创建出的位图并不是只有11个二进制位,而是有两个字节共16个二进制位,如下图所示 。
说明 :从个图我们也可以看到,除了偏移量为10的二进制位之外,其他所有未被设置的二进制位都被初始化成了0。
getbit key offsetn
bitcount key start endn
bitop and key1 key2n
说明: bitop 命令支持 and、or、not、xor这四种操作
bitpos key start endn
1 代表签到 ,0 代表未签到,这样可以很轻松地统计出用户的活跃程度 。相比于直接使用字符串而言 ,位图中的每一条记录仅占用一个bit位,从而大大降低了内存空间使用率。
2.统计登录次数
本文讲解了位图的基本数据结构和操作命令 ,位图适合于一些特定的场景 ,我们需要集合实际的业务场景情况 ,选择合适的数据结构存储能够大大的降低Redis的内存空间 。