:::info redis实现布隆过滤器是基于bitmap实现的,bitmap:Bitmap详解
布隆过滤器的原理:布隆过滤器(BloomFilter) :::

Redis中使用布隆过滤器有两种方式,一种是使用redis提供的 bitmap 来自己实现,一种是使用redis官方提供的布隆过滤器插件 RedisBloom 来实现。

Redis插件之BloomFilter

操作bitmap的语法:

设置值 SETBIT

  1. SETBIT key offset value

key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
位的设置或清除取决于 value 参数,可以是 0 也可以是 1 也只能是0 或者 1
key 不存在时,自动生成一个新的字符串值。
字符串会进行伸展(grown)以确保它可以将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。
offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。

返回值
字符串值指定偏移量上原来储存的位(bit)。

  1. 127.0.0.1:6379> setbit f1 125 1
  2. (integer) 0
  3. 127.0.0.1:6379> setbit f1 125 0
  4. (integer) 1
  5. 127.0.0.1:6379> setbit f1 125 1
  6. (integer) 0

查询值 GETBIT

  1. GETBIT key offset

key 所储存的字符串值,获取指定偏移量上的位(bit)。
offset 比字符串值的长度大,或者 key 不存在时,返回 0

返回值
字符串值指定偏移量上的位(bit)。

  1. 127.0.0.1:6379> getbit f1 125
  2. (integer) 1
  3. 127.0.0.1:6379> getbit f1 124
  4. (integer) 0

Bitmap的底层

  1. 127.0.0.1:6379> get f1
  2. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04"
  3. 127.0.0.1:6379> object encoding f1
  4. "raw"

可以看到,bitmap其实本身也是个String,存储结构为row

获取Bitmaps 指定范围值为 1 的位个数

  1. BITCOUNT key start end

计算给定字符串中,被设置为 1 的比特位的数量。
不指定 startend 的情况下,给定的整个字符串都会被进行计数。
startend 参数的设置都可以使用负数值: 比如 -1 表示最后一个字节, -2表示倒数第二个字节,以此类推。
不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0

返回值
被设置为 1 的位的数量。

  1. 127.0.0.1:6379> bitcount f1
  2. (integer) 1
  3. 127.0.0.1:6379> setbit f1 5 1
  4. (integer) 0
  5. 127.0.0.1:6379> bitcount f1
  6. (integer) 2

参考文章地址

https://juejin.cn/post/6844903561839525902
https://zhuanlan.zhihu.com/p/94668736
https://oss.redislabs.com/redisbloom/