*Redis BITCOUNT 命令 统计字符串中被设置为 1 的位数
*语法
BITCOUNT key [start end [BIT|BYTE]]
*说明
BITCOUNT 统计字符串中被设置为 1 的 bit 位数。
默认情况下,命令会对整个字符串进行计数。通过指定可选的 start 和 end 参数,可以只对特定字节范围(或 bit 范围,Redis 7.0+)进行统计。start 和 end 都可以使用负值:-1 表示最后一个字节/bit,-2 表示倒数第二个,以此类推。
不存在的 key 被当作空字符串处理,因此 BITCOUNT 对不存在的 key 返回 0。
*返回值
Integer reply:被设置为 1 的 bit 数量。
*时间复杂度
O(N),其中 N 是统计的字符串长度。
*版本兼容性
| Redis 版本 | 说明 |
|---|---|
| >= 2.6.0 | BITCOUNT 基础命令与 start/end 参数 |
| >= 7.0.0 | 支持 BIT 模式,可按 bit 偏移量统计 |
*示例
# 统计整个字符串中值为 1 的 bit 数量
SET mykey "foobar"
BITCOUNT mykey
# 仅统计第 1 个字节(byte 0)
BITCOUNT mykey 0 0
# 统计第 2 到第 3 个字节
BITCOUNT mykey 1 1
# 按 bit 范围统计(Redis 7.0+)
BITCOUNT mykey 0 15 BIT
*模式:使用 bitmap 实现用户上线次数统计
BITCOUNT 与 SETBIT 配合非常适合做时间线类统计。例如记录用户每天是否登录:
- 网站上线第 100 天,用户 peter 访问了,执行
SETBIT peter 100 1 - 第 101 天也访问了,执行
SETBIT peter 101 1 - 统计 peter 总共登录了多少天:
BITCOUNT peter
即使运行 10 年,每个用户也仅占 10 * 365 bit ≈ 456 字节,统计速度接近 O(1) 操作。对于超大 bitmap,可将其拆分为多个较小的 key,或使用 start/end 分批计算后在客户端汇总。