共计 1936 个字符,预计需要花费 5 分钟才能阅读完成。
前言
本篇文章的代码示例已放到 github 上,Git 地址为:advance(记录每一个学习过程),我的项目的介绍页面是我所有文章的一个援用目录,大家在援用目录外面即可找到对应文章的一个代码门路。
大家感觉有用的话,麻烦点个 star👍再走呗!
应用场景
针对 Redis 的缓存穿透问题,布隆过滤器是一个常见的解决办法。在单机的场景下,咱们能够应用谷歌的 guava 包外面提供的布隆过滤器。在分布式的场景下,咱们也能够选用 Redis 来实现布隆过滤器。
尽管,Redis 的 BitMap 人造就能够作为 布隆过滤器来实现,但毕竟本人实现的话,还是会有点麻烦。因而,咱们能够选用 redisson 提供的布隆过滤器,进步咱们的开发效率。
罕用办法
配置布隆过滤器的 Bean
@Bean | |
public RBloomFilter<String> bloomFilter(){ | |
// 定义一个布隆过滤器,指定布隆过滤器的名称 | |
RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("bloomTest"); | |
// 定义布隆过滤器的大小,以及误差率 | |
bloomFilter.tryInit(100000L, 0.003); | |
return bloomFilter; | |
} |
获取布隆过滤器
配置完之后,这个布隆过滤器就在 Spring 容器外面了,能够间接注入进来
@Autowired | |
private RBloomFilter<String> bloomFilter; |
增加元素
String name1 = "小明"; | |
String name2 = "小张"; | |
bloomFilter.add(name1); | |
bloomFilter.add(name2); |
判断布隆过滤器中是否存在某元素
boolean flag1 = bloomFilter.contains("小明"); | |
System.out.println("布隆过滤器中是否可能有小明?" + flag1); |
获取布隆过滤器的元素总数
System.out.println("以后布隆过滤器中有多少个数?" + bloomFilter.count());
获取布隆过滤器预计能够插入多少个数
System.out.println("预计布隆过滤器中能够插入多少个数?" + bloomFilter.getExpectedInsertions());
获取布隆过滤器的容错率
System.out.println("布隆过滤器的容错率:" + bloomFilter.getFalseProbability());
获取哈希函数的个数
System.out.println("布隆过滤器哈希哈数的个数:" + bloomFilter.getHashIterations());
获取 Bit 位的个数
System.out.println("布隆过滤器的 bit 位有多少个?" + bloomFilter.getSize());
应用示例
@Component | |
public class LineRunner implements CommandLineRunner { | |
@Autowired | |
private RBloomFilter<String> bloomFilter; | |
@Override | |
public void run(String... args) throws Exception { | |
String name1 = "小明"; | |
String name2 = "小张"; | |
bloomFilter.add(name1); | |
bloomFilter.add(name2); | |
boolean flag1 = bloomFilter.contains("小明"); | |
System.out.println("布隆过滤器中是否可能有小明?" + flag1); | |
boolean flag2 = bloomFilter.contains("小李"); | |
System.out.println("布隆过滤器中是否可能有小李?" + flag2); | |
System.out.println("以后布隆过滤器中有多少个数?" + bloomFilter.count()); | |
System.out.println("预计布隆过滤器中能够插入多少个数?" + bloomFilter.getExpectedInsertions()); | |
System.out.println("布隆过滤器的容错率:" + bloomFilter.getFalseProbability()); | |
System.out.println("布隆过滤器哈希哈数的个数:" + bloomFilter.getHashIterations()); | |
System.out.println("布隆过滤器的 bit 位有多少个?" + bloomFilter.getSize()); | |
} | |
} |
运行后果
正文完
发表至: springboot
2023-09-23