BITCOUNT

用法
BITCOUNT key [ start [ end [ BYTE | BIT ] ] ]
复杂度
O(N)
2.6.0
ACL 类别
@bitmap, @read, @slow

计算字符串中设置位的数量(人口计数)。

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

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

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

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

示例

127.0.0.1:6379> SET mykey "foobar"
OK
127.0.0.1:6379> BITCOUNT mykey
(integer) 26
127.0.0.1:6379> BITCOUNT mykey 0 0
(integer) 4
127.0.0.1:6379> BITCOUNT mykey 1 1
(integer) 6
127.0.0.1:6379> BITCOUNT mykey 1 1 BYTE
(integer) 6
127.0.0.1:6379> BITCOUNT mykey 5 30 BIT
(integer) 17

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

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

使用 SETBIT 命令很容易实现这一点,每天用一个小的递增整数来标识。例如,第 0 天是应用程序上线的第一天,第 1 天是第二天,依此类推。

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

稍后,只需对位图调用 BITCOUNT 命令,即可轻松知道用户访问网站的单日数量。

一种用用户 ID 代替日期的类似模式在名为“使用 Redis 位图实现快速、简单的实时指标”的文章中进行了描述。

性能考量

在上述计算天数的例子中,即使应用程序上线 10 年后,每个用户的数据量仍然只有 365*10 位,即每个用户仅 456 字节。对于这种数据量,BITCOUNT 仍然像 GETINCR 等其他 O(1) Valkey 命令一样快。

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

  • 使用一个单独的键,每次修改位图时都递增它。这可以使用一个小的 Lua 脚本来实现非常高效和原子性的操作。
  • 使用 BITCOUNTstartend 可选参数增量地处理位图,在客户端积累结果,并可选择将结果缓存到一个键中。

RESP2/RESP3 回复

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

历史

版本 变更
7.0.0

添加了 BYTE|BIT 选项。

8.0.0

end 变为可选;在不带参数调用时,命令报告最后一个字节。