Redis应用实践——位图

基础使用

因为只能存取0或1,适用于大量的bool类型数据,比如一年的签到记录,如果使用普通的key/value存储那么用户量上来之后的存储空间时惊人的。

如果使用位图存储,365天只需要365bit ,只需要46个字节就可以完全存储。

  • 使用setbit命令 setbit key 0 1

  • 使用getbit命令获取某一位上的值

支持零存整取或者整存零取,零存即一个一个位进行set,整存就是直接set字符串。

  • 使用bitcount进行统计

  • 使用bitpos进行查找

批量操作

在Redis3.2之前,想一次行操作位图的多个位,需要使用管道来进行。但是3.2之后新增了一个强大的指令bitfield, 但一次最多只能操作64位。

  • 使用biefield进行批量操作 bitfield key set u4/i4 value

上面的u代表无符号数,i代表有符号数。

  • bitfield key get u4 0

代表从第一位取4位,结果时无符号数。

bitfield同时支持incrby自增操作。

birfield中的incrby指令

bitfield key incrby u4 2 1代表从第三位开始,对接下来的4位无符号数+1。

如果加法发生上溢出或者下溢出,redis默认的策略时折返,比如1111 加一后溢出则这4位变成0000。

Redis贴心的提供了子指令供我们设置溢出后的策略,默认即是wrap–折返,还提供了fail–失败不执行(返回nil), sat–饱和截断(保持在最大值)