Bitmaps不是实际意义上的数据类型,而是定义在字符串类型上的一组面向比特位的操作。由于字符串是二进制安全blobs(二进制大对象),它们的最大长度为512Mb,因此可以设置多达232个不同的比特位。
比特位操作分为两类:恒定时间的单个比特位操作,比如将一个比特位设置为1或0,或者获取它的值;对一组比特位的操作,例如计算给定位范围内的比特位数(例如,总体计数)。
Bitmaps的最大优点之一,在存储信息时,可以极大的节省空间。例如,在一个使用自增id来表示不同用户的系统中,可以仅使用512 MB内存就能存储40亿用户的单个比特位信息(例如,用户是否想订阅消息)。
比特位的设置和检索使用SETBIT和GETBIT命令:
127.0.0.1:6379> setbit key 10 1
(integer) 0
127.0.0.1:6379> getbit key 10
(integer) 1
127.0.0.1:6379> getbit key 11
(integer) 0
SETBIT命令的第一个参数是比特位数(第几个比特位),第二个参数是要将比特位设置的值,只能为1或0。如果所寻址的位在当前字符串长度之外,该命令会自动增大字符串。
GETBIT只返回指定索引处的比特位的值。超出范围的比特位(在目标键的字符串长度之外的比特位)的值认为是零。
有三个命令可以操作一组比特位:
- BITOP在不同的字符串之间执行逐位操作。提供的操作符有AND,OR,XOR和NOT。
- BITCOUNT实现总体计数,统计被设置为1的比特位的数量。
- BITPOS查找第一个具有指定值0或1的比特位。
BITPOS和BITCOUNT都能够操作字符串的字节范围,而不是字符串的整个长度。下面是一个简单的BITCOUNT调用示例:
127.0.0.1:6379> setbit key 10 1
(integer) 0
127.0.0.1:6379> setbit key 11 1
(integer) 0
127.0.0.1:6379> bitcount key
(integer) 2
Bitmaps常见应用场景:
- 各种各样的实时分析。
- 存储与对象id关联的存储高效且高性能的布尔信息。
例如,假设您想知道网站用户按天计的最长的(连续)访问记录。从零开始计算天数,这是您将web站点公开的日子,并在每次用户访问web站点时设置SETBIT。至于比特位索引,只需取当前unix时间戳,减去初始偏移量,然后除以3600*24。
通过这种方式,每个用户都有一个包含每天访问信息的小字符串。使用BITCOUNT可以很容易地获得指定用户访问网站的天数,而使用一些BITPOS调用,或者简单地获取和分析bitmap,可以很容易地计算最长的连续字符。
Bitmaps分割成多个键是很简单的,例如为了切分数据集,因为通常最好避免使用大键。要在不同的键之间切分bitmap,而不是将所有的比特位都设置到一个键,一个简单的策略就是在每个键上存储M个比特位,并使用bit-number/M来获取键名,使用bit-number MOD M来定位键内的第N个比特位。
网友评论