BITCOUNT

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

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

默认情况下,会检查字符串中包含的所有字节。可以传递额外的参数 startend,仅在指定区间内执行统计操作。

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

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

默认情况下,额外的参数 startend 指定字节索引。可以使用额外的参数 BYTE|BIT 指定比特位索引。因此 0 是第一个比特位,1 是第二个比特位,以此类推。对于负值,-1 是最后一个比特位,-2 是倒数第二个比特位,以此类推。

示例

SET mykey "foobar" BITCOUNT mykey BITCOUNT mykey 0 0 BITCOUNT mykey 1 1 BITCOUNT mykey 1 1 BYTE BITCOUNT mykey 5 30 BIT

模式:使用位图进行实时指标

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

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

每当用户执行页面浏览时,应用程序可以使用 SETBIT 命令在当前天注册该事件,该命令将对应于当前天的比特位设置为 1。

稍后,只需对位图调用 BITCOUNT 命令,就可以轻松地知道用户访问网站的单个天数。

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

性能注意事项

在上述统计天数的示例中,即使应用程序上线 10 年后,我们仍然每个用户只有 365*10 个比特位的数据,即每个用户只有 456 个字节的数据。对于如此少的数据量,BITCOUNT 的速度与其他 O(1) Redis 命令(如 GETINCR)一样快。

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

  • 使用一个单独的键,每当位图修改时就增加该键的值。使用一小段 Redis Lua 脚本来实现这一点非常高效且原子性。
  • 使用 BITCOUNTstartend 可选参数逐步执行位图统计,在客户端累积结果,并选择性地将结果缓存到一个键中。

RESP2/RESP3 响应

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

历史

  • 从 Redis 7.0.0 版本开始:添加了 BYTE|BIT 选项。
RATE THIS PAGE
Back to top ↑