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 文档许可。