目录
[1 基本特性](#1 基本特性)
[2 主要操作命令](#2 主要操作命令)
[2.1 SETBIT key offset value](#2.1 SETBIT key offset value)
[2.2 GETBIT key offset](#2.2 GETBIT key offset)
[2.3 BITCOUNT key [start] [end]](#2.3 BITCOUNT key [start] [end])
[2.4 BITOP operation destkey key [key ...]](#2.4 BITOP operation destkey key [key ...])
[2.5 BITPOS key bit [start] [end]](#2.5 BITPOS key bit [start] [end])
[3 使用场景](#3 使用场景)
Redis 的位图(Bitmaps)并不是一种独立的数据类型,而是基于字符串(String)数据类型的一种特殊应用。位图允许你将一个字符串视为一系列的二进制位(bit),每个位可以是 0 或 1。通过这种方式,你可以非常高效地处理大量布尔值。
1 基本特性
- 空间效率:位图使用非常紧凑的存储方式,因为每个位只占用 1 比特。例如,一个包含 1000 万个布尔值的位图只需要大约 1.2 MB 的内存。
- 原子操作:位图支持原子操作,可以在不锁定整个键的情况下修改单个位。
- 位级操作:提供了丰富的位级操作命令,如设置、获取和计算位的数量等。
2 主要操作命令
2.1 SETBIT key offset value
设置指定偏移量处的位为 value
(0 或 1)。如果该位不存在,则扩展字符串。
127.0.0.1:6379> setbit bitmap 0 1
(integer) 0
2.2 GETBIT key offset
获取指定偏移量处的位值。
127.0.0.1:6379> getbit bitmap 0
(integer) 1
2.3 BITCOUNT key [start] [end]
计算字符串中被设置为 1 的位的数量。可选参数 start
和 end
用于指定范围。
127.0.0.1:6379> setbit bitmap 0 1
(integer) 0
127.0.0.1:6379> setbit bitmap 1 1
(integer) 0
127.0.0.1:6379> setbit bitmap 2 0
(integer) 0
127.0.0.1:6379> setbit bitmap 3 1
(integer) 0
127.0.0.1:6379> bitcount bitmap
(integer) 3
2.4 BITOP operation destkey key [key ...]
对多个字符串执行位运算,并将结果存储在 destkey
中。支持的操作包括 AND
、OR
、XOR
和 NOT
。
-
AND
操作:- 对所有输入键中的每一位执行按位与操作。
- 只有当所有输入键在相应位置上的位都为 1 时,结果才为 1。
-
OR
操作:- 对所有输入键中的每一位执行按位或操作。
- 只要有一个输入键在相应位置上的位为 1,结果就为 1。
-
XOR
操作:- 对所有输入键中的每一位执行按位异或操作。
- 如果输入键在相应位置上的位中有奇数个 1,结果为 1;否则为 0。
-
NOT
操作:- 对单个输入键中的每一位执行按位非操作。
- 将每一位取反,1 变为 0,0 变为 1。
假设你有两个位图 bitmap1
和 bitmap2
,并且已经设置了一些位:
127.0.0.1:6379> SETBIT bitmap1 0 1
(integer) 0
127.0.0.1:6379> SETBIT bitmap1 1 0
(integer) 0
127.0.0.1:6379> SETBIT bitmap1 2 1
(integer) 0
127.0.0.1:6379> SETBIT bitmap1 3 1
(integer) 0
127.0.0.1:6379> SETBIT bitmap2 0 0
(integer) 0
127.0.0.1:6379> SETBIT bitmap2 1 1
(integer) 0
127.0.0.1:6379> SETBIT bitmap2 2 1
(integer) 0
127.0.0.1:6379> SETBIT bitmap2 3 0
(integer) 0
bitmap1
的二进制表示是00001011
。bitmap2
的二进制表示是00000110。
执行 BITOP AND
操作:
127.0.0.1:6379> BITOP AND result_and bitmap1 bitmap2
(integer) 1
bitmap1
(00001011) ANDbitmap2
(00000110) =00000010
- 结果
result_and
的二进制表示为00000010
。
执行 BITOP OR
操作:
127.0.0.1:6379> BITOP OR result_or bitmap1 bitmap2
(integer) 1
bitmap1
(00001011) ORbitmap2
(00000110) =00001111
- 结果
result_or
的二进制表示为00001111
。
执行 BITOP XOR
操作:
127.0.0.1:6379> BITOP XOR result_xor bitmap1 bitmap2
(integer) 1
bitmap1
(00001011) XORbitmap2
(00000110) =00001101
- 结果
result_xor
的二进制表示为00001101
。
2.5 BITPOS key bit [start] [end]
找到第一个被设置为 bit
(0 或 1)的位的位置。可选参数 start
和 end
用于指定搜索范围。
127.0.0.1:6379> setbit bitmap 0 1
(integer) 0
127.0.0.1:6379> setbit bitmap 1 1
(integer) 0
127.0.0.1:6379> setbit bitmap 2 0
(integer) 0
127.0.0.1:6379> setbit bitmap 3 1
(integer) 0
127.0.0.1:6379> bitpos bitmap 0
(integer) 2
127.0.0.1:6379> bitpos bitmap 1
(integer) 0
更多命令请参考:Commands | Docs
3 使用场景
-
用户在线状态:
- 可以用位图来记录用户的在线状态。例如,每天用一个位图表示所有用户的状态,其中每一位代表一个用户,1 表示在线,0 表示离线。
-
日活跃用户统计:
- 通过位图可以记录每天的活跃用户。每一位代表一个用户,1 表示当天活跃,0 表示不活跃。然后可以通过
BITCOUNT
计算每天的活跃用户数。
- 通过位图可以记录每天的活跃用户。每一位代表一个用户,1 表示当天活跃,0 表示不活跃。然后可以通过
-
权限控制:
- 位图可以用来管理用户的权限。每一位可以代表一种权限,1 表示拥有该权限,0 表示没有。
-
事件跟踪:
- 例如,在广告点击追踪中,可以用位图记录哪些用户点击了某个广告。每一位代表一个用户,1 表示点击过,0 表示没有点击。
-
性能计数器:
- 位图可以用来实现高效的计数器。例如,记录每分钟的请求次数,每一位代表一秒钟,1 表示有请求,0 表示没有请求。
-
IP 地址黑名单/白名单:
- 位图可以用来存储 IP 地址黑名单或白名单。每一位代表一个 IP 地址,1 表示禁止访问,0 表示允许访问。