- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- <version>28.1-jre</version>
- </dependency>
Guava 中的布隆过滤器实现的很是伟大,关于细节我们就不去探讨了,我们就来看看 Guava 中布隆过滤器的结构函数吧,Guava 中并没有提供结构函数,并且提供了 create 要领来结构布隆过滤器:
- public static <T> BloomFilter<T> create(
- Funnel<? super T> funnel, int expectedInsertions, double fpp) {
- return create(funnel, (long) expectedInsertions, fpp);
- }
funnel:你要过滤数据的范例
expectedInsertions:你要存放的数据量
fpp:误判率
你只必要传入这三个参数你就可以行使 Guava 包中的布隆过滤器了,下面这我写的一段 Guava 布隆过滤器测试措施,可以窜改 fpp 多运行屡次,体验 Guava 的布隆过滤器。
- public class GuavaBloomFilterTest {
- // bit 数组巨细
- private static int size = 10000;
- // 布隆过滤器
- private static BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), size, 0.03);
-
- public static void main(String[] args) {
- // 先向布隆过滤器中添加 10000 个url
- for (int i = 0; i < size; i++) {
- String url = "https://voice.hupu.com/nba/" + i;
- bloomFilter.put(url);
- }
- // 前10000个url不会呈现误判
- for (int i = 0; i < size; i++) {
- String url = "https://voice.hupu.com/nba/" + i;
- if (!bloomFilter.mightContain(url)) {
- System.out.println("该 url 被收罗过了");
- }
- }
- List<String> list = new ArrayList<String>(1000);
- // 再向布隆过滤器中添加 2000 个 url ,在这2000 此中就会呈现误判了
- // 误判的个数为 2000 * fpp
- for (int i = size; i < size + 2000; i++) {
- String url = "https://voice.hupu.com/nba/" + i;
- if (bloomFilter.mightContain(url)) {
- list.add(url);
- }
- }
- System.out.println("误判数目:" + list.size());
- }
- }
布隆过滤器的应用
缓存击穿
缓存击穿是查询数据库中不存在的数据,假若有效户恶意模仿哀求许多缓存中不存在的数据,因为缓存中都没有,导致这些哀求短时刻内直接落在了DB上,对DB发生压力,导致数据库非常。 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|