Redis 位图

Redis位图简介

位图不是一种实际的数据类型,而是一组基于字符串类型的位操作,字符串被视为位向量。由于字符串是二进制安全的大对象,并且它们的最大长度为512 MB,因此它们适合设置多达2^32个不同的位。

您可以对一个或多个字符串执行位操作。 位图使用案例的一些示例包括:

  • 对于集合成员对应于整数0-N的情况,提供高效的集合表示。
  • 对象权限,其中每个位代表一个特定的权限,类似于文件系统存储权限的方式。

基本命令

  • SETBIT 在提供的偏移量处将位设置为0或1。
  • GETBIT 返回给定偏移量处的位值。

查看位图命令的完整列表

Example

假设你有1000名自行车手在乡村赛道上比赛,他们的自行车上装有编号为0-999的传感器。 你想快速确定某个传感器是否在一小时内向跟踪服务器发送了信号以检查骑手的状态。

你可以使用一个位图来表示这个场景,其键引用当前小时。

  • 骑手123在2024年1月1日的00:00小时内向服务器发送了ping请求。然后你可以确认骑手123已经向服务器发送了ping请求。你也可以检查骑手456是否在同一小时内向服务器发送了ping请求。

位操作

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

位图的最大优势之一是,在存储信息时,它们通常能提供极大的空间节省。例如,在一个系统中,不同的用户由递增的用户ID表示,只需512 MB的内存就可以记住40亿用户的单个位信息(例如,知道用户是否希望接收新闻通讯)。

SETBIT 命令的第一个参数是位号,第二个参数是要设置的位值,即1或0。如果指定的位在当前字符串长度之外,该命令会自动扩展字符串。

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

有三个命令用于操作位组:

  1. BITOP 在不同的字符串之间执行位操作。提供的操作包括 AND、OR、XOR 和 NOT。
  2. BITCOUNT 执行人口计数,报告设置为1的位数。
  3. BITPOS 查找第一个具有指定值0或1的位。

无论是 BITPOS 还是 BITCOUNT 都能够操作字符串的字节范围,而不是对整个字符串的长度进行操作。我们可以轻松地查看位图中已设置的位数。

例如,假设你想知道你的网站用户每日访问的最长连续天数。你从零开始计数天数,即你网站公开的那一天,并在每次用户访问网站时使用SETBIT设置一个位。作为位索引,你只需取当前的unix时间,减去初始偏移量,然后除以一天的秒数(通常为3600*24)。

这样,对于每个用户,你都有一个包含每天访问信息的小字符串。使用BITCOUNT可以轻松获取给定用户访问网站的天数,而通过几次BITPOS调用,或者简单地在客户端获取和分析位图,可以轻松计算最长连续访问天数。

位图可以轻松地分割成多个键,例如为了分片数据集,并且通常最好避免处理巨大的键。要将位图分割到不同的键中,而不是将所有位设置到一个键中,一个简单的策略是每个键存储M位,并使用bit-number/M获取键名,并使用bit-number MOD M在键内定位第N位。

性能

SETBITGETBIT 是 O(1) 的。 BITOP 是 O(n) 的,其中 n 是比较中最长字符串的长度。

了解更多

RATE THIS PAGE
Back to top ↑