Sfoglia il codice sorgente

优化BloomFilter,增加contains方法

zhouhao 6 anni fa
parent
commit
db56fe3fb4

+ 3 - 3
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/src/main/java/org/hswebframework/web/concurrent/counter/AbstractBoomFilterManager.java

@@ -12,9 +12,9 @@ public abstract class AbstractBoomFilterManager implements BloomFilterManager {
 
     @Override
     public BloomFilter getBloomFilter(String key) {
-        BloomFilter counter = counterStore.get(key);
-        if (counter != null) {
-            return counter;
+        BloomFilter filter = counterStore.get(key);
+        if (filter != null) {
+            return filter;
         }
         synchronized (counterStore) {
             return counterStore.computeIfAbsent(key, this::createBloomFilter);

+ 2 - 0
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/src/main/java/org/hswebframework/web/concurrent/counter/BloomFilter.java

@@ -8,6 +8,8 @@ public interface BloomFilter {
 
     boolean put(String unique);
 
+    boolean contains(String unique);
+
     @SneakyThrows
     default void tryPut(String unique, Supplier<? extends Exception> supplier) {
         if (!put(unique)) {

+ 11 - 1
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/src/main/java/org/hswebframework/web/concurrent/counter/GuavaBloomFilterManager.java

@@ -17,6 +17,16 @@ public class GuavaBloomFilterManager extends AbstractBoomFilterManager {
     protected BloomFilter createBloomFilter(String name) {
         com.google.common.hash.BloomFilter<String>
                 filter = com.google.common.hash.BloomFilter.create((str, sink) -> sink.putString(str, StandardCharsets.UTF_8), expectedInsertions, fpp);
-        return filter::put;
+        return new BloomFilter() {
+            @Override
+            public boolean put(String unique) {
+                return filter.put(unique);
+            }
+
+            @Override
+            public boolean contains(String unique) {
+                return filter.mightContain(unique);
+            }
+        };
     }
 }

+ 5 - 2
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/src/test/java/org/hswebframework/web/concurrent/counter/GuavaBloomFilterManagerTest.java

@@ -14,8 +14,11 @@ public class GuavaBloomFilterManagerTest {
         BloomFilter filter = manager.getBloomFilter("test");
         Assert.assertNotNull(filter);
 
-        Assert.assertTrue(filter.put("test"));
-        Assert.assertFalse(filter.put("test"));
+        for (int i = 0; i < 100000; i++) {
+            Assert.assertTrue(filter.put("test" + i));
+            Assert.assertTrue(filter.contains("test" + i));
+            Assert.assertFalse(filter.put("test" + i));
+        }
 
     }
 

+ 11 - 1
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-redis/src/main/java/org/hswebframework/web/counter/redis/RedisBloomFilterManager.java

@@ -16,6 +16,16 @@ public class RedisBloomFilterManager extends AbstractBoomFilterManager {
     protected BloomFilter createBloomFilter(String name) {
         RBloomFilter<String> filter = redissonClient.getBloomFilter("hsweb:bloom-filter:" + name, StringCodec.INSTANCE);
         filter.tryInit(55000000L, 0.01);
-        return filter::add;
+        return new BloomFilter() {
+            @Override
+            public boolean put(String unique) {
+                return filter.add(unique);
+            }
+
+            @Override
+            public boolean contains(String unique) {
+                return filter.contains(unique);
+            }
+        };
     }
 }