BITCOUNT

Syntax
BITCOUNT key [start end [BYTE | BIT]]
Available since:
2.6.0
Time complexity:
O(N)
ACL categories:
@read, @bitmap, @slow,

计算字符串中设置的位数(人口计数)。

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

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

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

默认情况下,附加参数startend指定一个字节索引。 我们可以使用附加参数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应用程序,因此例如可以确定哪些用户是测试功能的好目标。

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

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

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

在名为“使用Redis位图快速简便的实时指标”的文章中描述了一种类似的模式,其中使用用户ID而不是天数。

性能考虑

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

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

  • 采用一个独立的键,每次位图被修改时都会递增。 使用一个小的Redis Lua脚本,这可以非常高效且原子化。
  • 使用BITCOUNTstartend可选参数逐步运行位图,在客户端累积结果,并可选地将结果缓存到一个键中。

RESP2/RESP3 回复

Integer reply: the number of bits set to 1.

历史

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