runoops.com

Redis Bitmaps

bitmaps不是实际的数据类型,而是在String类型上定义的一组面向位的操作。 由于字符串是二进制安全Blob,并且最大长度为512 MB,因此它们适合设置多达2 ^ 32个不同的位。

位操作分为两类:固定时间的单个位操作(如将一个位设置为1或0或获取其值),以及对位组的操作,例如,计算给定位范围内设置位的数量 (例如,人口计数)。

bitmaps的最大优点之一是,它们在存储信息时通常可以节省大量空间。 例如,在以增量用户ID表示不同用户的系统中,仅使用512 MB内存就可以记住40亿用户的一位信息(例如,知道用户是否要接收新闻通讯)。

使用SETBIT和GETBIT命令设置和检索位:

> setbit key 10 1
(integer) 1
> getbit key 10
(integer) 1
> getbit key 11
(integer) 0

SETBIT命令将位号作为其第一个参数,将其设置为1或0的值作为其第二个参数。如果所寻址的位超出当前字符串长度,则该命令将自动放大字符串。

GETBIT只是返回指定索引处的位的值。 超出范围的位(寻址超出存储在目标键中的字符串长度的位)始终被视为零。

在位组上有三个命令:

1,BITOP在不同的字符串之间执行按位运算。 提供的运算为AND,OR,XOR和NOT。
2,BITCOUNT执行填充计数,报告设置为1的位数。
3,BITPOS查找指定值为0或1的第一位。

BITPOS和BITCOUNT都可以在字符串的字节范围内运行,而不是在字符串的整个长度上运行。 以下是BITCOUNT调用的一个简单示例:

> setbit key 0 1
(integer) 0
> setbit key 100 1
(integer) 0
> bitcount key
(integer) 2

位图的常见用例是:

各种实时分析。
存储与对象ID相关联的空间高效但高性能的布尔信息。

例如,假设您想知道网站用户每天访问量最长的时间。您从零开始计算天数,即从您公开网站的那一天开始,并在用户每次访问该网站时对SETBIT进行设置。作为位索引,您只需花费当前的unix时间,减去初始偏移,然后除以3600 * 24。

这样,对于每个用户,您都有一个小的字符串,其中包含每天的访问信息。使用BITCOUNT,可以轻松获得给定用户访问网站的天数,而只需几个BITPOS调用,或者仅获取和分析客户端的位图,就可以轻松计算最长的连胜记录。

位图很容易分成多个键,例如,为了分片数据集,并且因为通常最好避免使用大键。要在不同的键上拆分位图,而不是将所有位都设置为键,一个简单的策略是每个键存储M位,并获得具有位号/ M的键名,并使用bit来获取要在键内部寻址的第N位。编号MODM。