系列文章数组
咱们都知道8bit = 1b = kb,
bitmap
就是经过最小的单位bit
来进行0或者1的设置,表示某个元素对应的值或者状态。 一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。微信
位图并非一种特殊的数据结构,其实本质上是二进制字符串,也能够看作是 byte 数组。可使用普通的 get/set 直接获取和设置整个位图的内容,也可使用位图操做 getbit/setbit 等将 byte 数组当作「位数组」来处理。数据结构
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 SETBIT key offset value
offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 以内)。异步
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 GETBIT key offset
分布式
计算给定字符串中,被设置为 1 的比特位的数量。 BITCOUNT key
post
返回位图中第一个值为 bit 的二进制位的位置。 BITPOS key bit [start] [end]
性能
对一个或多个保存二进制位的字符串 key 进行位元操做,并将结果保存到 destkey 上。 BITOP operation destkey key [key …]
operation 能够是 AND 、 OR 、 NOT 、 XOR 这四种操做中的任意一种 BITOP AND destkey key [key ...]
,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。code
bitfield 有三个子指令,分别是 get/set/incrby,它们均可以对指定位片断进行读写,可是最多只能处理 64 个连续的位,若是超过 64 位,就得使用多个子指令,bitfield 能够一次执行多个子指令。cdn
记录用户的签到,每日在线状况等,能够将当天或者当天的偏移量对应的bit位设置为1便可,使用BITCOUNT
能够轻松统计签到次数。队列
还有一种使用比较多的状况,就是设置各种状态值,例如商城的设置:是否能够评价订单,是否展现售罄商品,是否正常营业等状态值可使用bitmap来存储
在性能方面,如前面提到的签到,即便运行 10 年,占用的空间也只是每一个用户 10*365 比特位(bit),也便是每一个用户 456 字节。对于这种大小的数据来讲, BITCOUNT key [start] [end] 的处理速度就像 GET key 和 INCR key 这种 O(1) 复杂度的操做同样快。
固然若是你的 bitmap 数据很是大,那么能够考虑使用如下两种方法:
本文亦在微信公众号【小道资讯】发布,欢迎扫码关注!