BITCOUNT

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

语法

BITCOUNT key [start end [BYTE | BIT]]

引入版本:2.6.0

复杂度摘要:O(N)

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

默认情况下,检查字符串中包含的所有字节。可以仅在传递附加参数 开始 和 结束 的间隔中指定计数操作。

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

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

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

必需参数

key

保存字符串的键的名称。

可选参数

start end

仅对 start 至 end(含)范围内的设置位进行计数。默认情况下,这些是字节偏移量;负值从字符串末尾开始计数。

BYTE | BIT

将 start 和 end 解释为字节偏移(BYTE,默认值)或位偏移(BIT)。

示例

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

详细说明

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

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

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

每次用户执行页面查看时,应用程序都可以使用 SETBIT 命令设置与当天对应的位来注册用户在当天访问了网站。

稍后只需针对位图调用 BITCOUNT 命令即可轻松了解用户访问网站的单天数。

名为“使用 Redis 位图快速轻松地实现实时指标”的文章中描述了使用用户 ID 而不是天数的类似模式。

性能考虑

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

当位图很大时,有两种选择:

  • 采用一个单独的键,每次修改位图时该键都会递增。使用小型 Redis Lua 脚本可以非常高效且原子。
  • 使用 BITCOUNT 开始 和 结束 可选参数增量运行位图,在客户端累积结果,并可选择将结果缓存到键中。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 标准
✅ 主动-主动
✅ 标准
✅ 主动-主动

返回值

RESP2

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

RESP3

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

资料来源:Redis 官方 BITCOUNT 文档;中文内容参考 Redis 文档许可。