Redisson的布隆过滤器 - 详解

布隆过滤器用来判断某个元素是否存在。

使用场景

解决redis缓存穿透,当判断不存在该数据时,直接返回;

垃圾邮箱过滤;

防止内容的重复推荐;

避免爬取相同的URL等等

基本算法

给出一个长度是n的数组,元素的值是0或者1;

向布隆过滤器中添加元素时,根据m个hash函数对元素进行运算,得到m个位置;

将这m个位置的元素设置为1;

判断某个元素是否存在时,也是根据m个hash函数进行运算,如果m个位置的元素都为1,说明元素存在,只要某个位置存在一个0,则说明不存在。

由于hash冲突,布隆过滤器可以判断元素一定不存在,但是不能保证一定存在,其存在一定的误判率。

注:图片来自网络

导入jar

org.springframework.boot
spring-boot-starter-data-redis
org.redisson
redisson
3.18.0

配置类

package com.qfedu.redissontest.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient getRedisson() {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379")
.setDatabase(7)
.setRetryInterval(5000)
.setTimeout(10000)
.setConnectTimeout(10000);
return Redisson.create(config);
}
}

测试

@Test
void contextLoads() {
RBloomFilter bloomFilter = redisson.getBloomFilter("sample");
// 初始化布隆过滤器,预计统计元素数量为10000,期望误差率为0.01
bloomFilter.tryInit(10000L, 0.01);
bloomFilter.add(123L);
bloomFilter.add(234L);
boolean contains = bloomFilter.contains(123L);
System.out.println(contains);
}

posted @ 2025-08-14 19:50  yjbjingcha  阅读(25)  评论(0)    收藏  举报