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–饱和截断(保持在最大值)