所谓的 add 操作是这样的:首先根据几个不同的 hash 函数给元素进行 hash 运算一个整数索引值,拿到这个索引值之后,对位数
组的长度进行取模运算,得到一个位置,每一个 hash 函数都会得到一个位置,将位数组中对应的位置设置位 1 ,这样就完成了添加操作。
当判断元素是否粗存在时,依然先对元素进行 hash 运算,将运算的结果和位数组取模,然后去对应的
位置查看是否有相应的数据,如果有,表示元素可能存在(因为这个有数据的地方也可能是其他元素存
进来的),如果没有表示元素一定不存在。
Bloom Filter 中,误判的概率和位数组的大小有很大关系,位数组越大,误判概率越小,当然占用的存
储空间越大;位数组越小,误判概率越大,当然占用的存储空间就小。
布隆过滤器插件官方网站:https://oss.redislabs.com/redisbloom/Quick_Start/
这边主要介绍三种安装方式
Docker,指定容器映射端口和别名启动
docker run -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest
Git 克隆编译安装启动
cd redis-6.2.1 git clone https://github.com/RedisBloom/RedisBloom.git cd RedisBloom/ make cd .. redis-server redis.conf --loadmodule ./RedisBloom/redisbloom.so
上传tar包,解压安装启动
cd redis-6.2.1 tar -zxvf RedisBloom-2.2.5.tar.gz mv ./RedisBloom-2.2.5 /home/redis-6.2.1/RedisBloom redis-server redis.conf --loadmodule ./RedisBloom/redisbloom.so安装完成后,执行 bf.add 命令,测试安装是否成功。
每次启动时都输入 redis-server redis.conf --loadmodule ./RedisBloom/redisbloom.so 比较
麻烦,我们可以将要加载的模块在 redis.conf 中提前配置好。
最下面这一句,配置完成后,以后只需要 redis-server redis.conf 来启动 Redis 即可
5.基本用法主要是两类命令,添加和判断是否存在。
bf.add 添加
bf.madd 批量添加
bf.exists 判断是否存在
bf.mexists 批量判断
#命令使用示例 127.0.0.1:6379> BF.ADD k1 v1 (integer) 1 127.0.0.1:6379> BF.EXISTS k1 v1 (integer) 1 127.0.0.1:6379> BF.EXISTS k1 v2 (integer) 0 127.0.0.1:6379> BF.MADD k1 v1 v2 v3 v4 1) (integer) 0 2) (integer) 1 3) (integer) 1 4) (integer) 1 127.0.0.1:6379> BF.MEXISTS k1 v1 v2 v3 v4 v5 1) (integer) 1 2) (integer) 1 3) (integer) 1 4) (integer) 1 5) (integer) 0 127.0.0.1:6379>使用 Jedis 操作布隆过滤器,首先添加依赖:
<dependency> <groupId>com.redislabs</groupId> <artifactId>jrebloom</artifactId> <version>1.2.0</version> </dependency>进行测试:
package org.taoguoguo.bloom; import io.rebloom.client.Client; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.JedisPool; /** * @author taoguoguo * @description BloomFilter * @website https://www.cnblogs.com/doondo * @create 2021-04-21 21:04 */ public class BloomFilter { public static void main(String[] args) { GenericObjectPoolConfig config = new GenericObjectPoolConfig(); config.setMaxIdle(300); config.setMaxTotal(1000); config.setMaxWaitMillis(30000); config.setTestOnBorrow(true); JedisPool pool = new JedisPool(config, "192.168.124.5", 6379, 30000, "123456"); Client client = new Client(pool); //存入数据 for (int i = 0; i < 100000; i++) { client.add("name", "taoguoguo-"+ i ); } //判断是否存在 boolean exists = client.exists("name", "taoguoguo-9"); System.out.println(exists); } }控制台打印:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See #StaticLoggerBinder for further details. true布隆过滤器 存在是有可能会误判断的,我们将判断数量加大,尝试执行多次,是会存在误判的。所以布隆过滤器判断不存在时一定准确,判断存在时不一定准确。
6.参数配置