网页版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;用SET
或INCRBY
指令对超出当前字符串长度的位(含key不存在的情况)进行寻址,将会扩展字符串并对扩展部分进行补0,扩展方式包括:按需扩展、按最小长度扩展和按最大寻址能力扩展。
offset:偏移量前加上 # ,表示偏移量需要乘以type的位数
该种应用的关键点就在于对位图的理解和bitfield这个指令的使用。
最后才关注到这一章的名字叫做节衣缩食,不得不说,很贴切,在存储只有两种状况的key时使用位图能够大大节省空间开销。