*Redis BITCOUNT 命令 统计字符串中被设置为 1 的位数

*语法

BITCOUNT key [start end [BIT|BYTE]]

*说明

BITCOUNT 统计字符串中被设置为 1bit 位数。

默认情况下,命令会对整个字符串进行计数。通过指定可选的 startend 参数,可以只对特定字节范围(或 bit 范围,Redis 7.0+)进行统计。startend 都可以使用负值:-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 实现用户上线次数统计

BITCOUNTSETBIT 配合非常适合做时间线类统计。例如记录用户每天是否登录:

  • 网站上线第 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 分批计算后在客户端汇总。