BITCOUNT

语法
BITCOUNT key [start end [BYTE | BIT]]
可用版本
Redis 开源版 2.6.0
时间复杂度
O(N)
ACL 类别
@read, @bitmap, @slow,

计算字符串中设置为 1 的位的数量(总体计数)。

默认情况下,会检查字符串中包含的所有字节。可以通过传递附加参数 startend 来指定仅在特定区间内进行计数操作。

GETRANGE 命令类似,start 和 end 可以包含负值,以便从字符串末尾开始索引字节,其中 -1 是最后一个字节,-2 是倒数第二个字节,依此类推。

不存在的键被视为空字符串,因此命令将返回零。

默认情况下,附加参数 startend 指定字节索引。我们可以使用附加参数 BIT 来指定位索引。因此,0 是第一个位,1 是第二个位,依此类推。对于负值,-1 是最后一个位,-2 是倒数第二个位,依此类推。

示例

SET mykey "foobar" BITCOUNT mykey BITCOUNT mykey 0 0 BITCOUNT mykey 1 1 BITCOUNT mykey 1 1 BYTE BITCOUNT mykey 5 30 BIT

模式:使用位图实现实时指标

位图是一种非常节省空间的特定类型信息的表示形式。一个例子是 Web 应用程序需要用户的访问历史记录,以便例如可以确定哪些用户是测试功能的良好目标。

使用 SETBIT 命令可以轻松实现这一点,将每一天识别为一个小的递增整数。例如,第 0 天是应用程序上线的第 1 天,第 1 天是第二天,依此类推。

每次用户执行页面浏览时,应用程序可以使用 SETBIT 命令设置与当前日期对应的位来记录用户在当前日期访问了网站。

之后,只需对位图调用 BITCOUNT 命令,就可以轻松知道用户访问网站的单日天数。

一篇名为“使用 Redis 位图实现快速简便的实时指标”的文章描述了一种类似的模式,其中使用用户 ID 而不是天数。

性能考量

在上述计算天数的例子中,即使应用程序上线 10 年后,每个用户也只有 365*10 位数据,即每个用户仅 456 字节。对于这么大量的数据,BITCOUNT 的速度仍然与任何其他 O(1) 的 Redis 命令(如 GETINCR)一样快。

当位图很大时,有两种替代方案

  • 使用一个单独的键,每次修改位图时都递增该键。使用一个小的 Redis Lua 脚本可以非常高效且原子地实现这一点。
  • 使用 BITCOUNT 的可选参数 startend 递增地运行位图,在客户端累积结果,并可选地将结果缓存到一个键中。

RESP2/RESP3 回复

整数回复:设置为 1 的位的数量。

历史

  • 自 Redis 7.0.0 版本起:添加了 BYTE|BIT 选项。
评价此页
回到顶部 ↑