网页版redis并不支持bitfield这个指令

位图这一概念让我想起来一个算法问题,在N亿个数字中判断某个数是否存在,感兴趣的可以去看一下。

看过上面的问题之后我相信对书中的零存整取、整存零取概念就会理解了,书中的例子是将hello字符串转换为ASCII码进行零存整取整存零取

 

相关指令

  setbit key value 按位存

  getbit key 按位取

  set key value 整存

  get key 整取

统计和查找

  bitcount key [start end] 查找key内指定范围中的1的个数,值得注意的是start和end由于内存的物理结构限制,只能使8的整数倍。

  bitpos key 0/1 [start end] 在key的指定范围内查找第一个0/1的位置

  文中作者举例是用于统计用户在某个时间段内的签到次数。

  bitfield 这个指令的也是非常复杂,但是避免了在需要对位图多次get/set操作时必须使用管道的问题,建议查看官方文档(所以我上次蹩脚英语翻译是为了啥呢)简而言之,该指令可以在一行中执行多次get、set、incrby以及在对incrby溢出时的操作。其中的几个我觉得值得注意的点包括:

    type:u8、i16分别指的是8位无符号整型(unsigned int简写u),16位有符号整型(int间写i)

    get:使用get指令对超出字符串长度(或者key不存在)的位进行寻址时,会自动为缺失的位赋值为0;用SETINCRBY指令对超出当前字符串长度的位(含key不存在的情况)进行寻址,将会扩展字符串并对扩展部分进行补0,扩展方式包括:按需扩展、按最小长度扩展和按最大寻址能力扩展。

    offset:偏移量前加上 # ,表示偏移量需要乘以type的位数

 

该种应用的关键点就在于对位图的理解和bitfield这个指令的使用。


最后才关注到这一章的名字叫做节衣缩食,不得不说,很贴切,在存储只有两种状况的key时使用位图能够大大节省空间开销。