关于位图,可能你们不太熟悉,git
那么位图能干啥呢?位图的内容其实就是普通的字符串,也就是byte数组,咱们都知道数组
byte | 8 位无符号整数 | 0 到 255 |
说个场景。好比你处理一些业务时候,每每会存在 是或者不是 这样的数据,那么这种数据仍是频繁去查看和请求,从数据方面和请求次数方面都是很是的大的。那么Redis位图能够帮你解决。天天的记录只占据一个位,他的存储格式:0 1 0 1 0 1。在操做方面咱们可使用:get/set, gitbit/setbit等将byte数组当作【位数组】来处理。spa
说说他的特性:code
位数组是自动扩展的,若是超出现有内容范围,它会自动将位数组进行零扩充。索引
固然通常这种业务数据,都每每少不了统计,查找,那么位图指令统计bitcount和查找bitpos。bitcount 用来统计指定位置范围内 1 的个数,bitpos 用来查找指定范围内出现的第一个 0 或 1。字符串
bitpos指定的范围是【start,end】。注意的是start 和 end 参数是字节索引,也就是说指定的位范围必须是 8 的倍数,get
固然,咱们都知道以前指定的位图都是单个位的,固然也有一次操做多个位的,不过必须用管道,不过从3.2版本后。有个bitfield,有三个指令,分别是:get/set/incrby,它们均可以对指定位片断进行读写,可是最多只能处理 64 个连续的位,若是超过 64 位,就得使用多个子指令,bitfield 能够一次执行多个子指令。it
BITFIELD mykey INCRBY i5 100 1 GET u4 0
当须要一个整型时,有符号整型需在位数前加i,无符号在位数前加u
。例如,u8
是一个8位的无符号整型,i16
是一个16位的有符号整型。有符号整型最大支持64位,而无符号整型最大支持63位。对无符号整型的限制,是因为当前Redis协议不能在响应消息中返回64位无符号整数。table
所谓有符号数是指获取的位数组中第一个位是符号位,剩下的才是值。若是第一位是 1,那就是负数。无符号数表示非负数,没有符号位,获取的位数组所有都是值。有符号数最多能够获取 64 位,无符号数只能获取 63 位 (由于 Redis 协议中的 integer 是有符号数,最大 64 位,不能传递 64 位无符号值)。若是超出位数限制,Redis 就会告诉你参数错误。