天天看点

【Redis笔记】Redis Bitmaps

Bitmaps —

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

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

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

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

> setbit键10 1

(整数)1

> getbit键10

(整数)1

> getbit键11

(整数)0

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

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

有三组命令在一组位上运行:

BITOP在不同的字符串之间执行逐位操作。提供的操作是AND,OR,XOR和NOT。

BITCOUNT执行填充计数,报告设置为1的位数。

BITPOS查找具有指定值0或1的第一个位。

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

> setbit键0 1

(整数)0

> setbit键100 1

(整数)0

> bitcount键

(整数)2

位图的常见用户案例是:

各种实时分析。

存储与对象ID关联的节省空间但高性能的布尔信息。

例如,想象一下您想知道网站用户每日访问的最长连续性。您开始计算从零开始的天数,即您将网站公开的日期,并在每次用户访问网站时使用SETBIT设置一些。作为位索引,您只需获取当前的unix时间,减去初始偏移量,然后除以3600 * 24。

这种方式对于每个用户,您都有一个包含每天访问信息的小字符串。使用BITCOUNT可以轻松获得给定用户访问网站的天数,同时只需几次BITPOS调用,或者只是获取和分析客户端位图,就可以轻松计算出最长的条纹。

位图很容易分成多个键,例如为了分片数据集,因为通常最好避免使用大键。要在不同的密钥上拆分位图而不是将所有的位都设置为密钥,一个简单的策略就是每个密钥存储M位并获得带有位号/ M的密钥名称和第N位用于在密钥内部用位寻址 - 数字MOD M.

继续阅读