本地服务器定时从redis拉取最新的bitmap值并更新本地的bitmap值,如果本地服务器有新增值,则将新增的值同步到redis服务器上
实现代码如下:
public class BloomFilterHelper<T> { private int numHashFunctions; private Funnel<T> funnel; private int bitSize; private BitArray bitArray; private String key; private volatile static Map<String,BloomFilterHelper> LOCALBLOOM= new ConcurrentHashMap<>(); private static Object Lock=new Object(); public static ThreadLocal<String> CurrentBloomKey=new ThreadLocal<>(); /** * 生成布隆过滤器 * @param key * @param funnel * @param expectedInsertions 布隆过滤器容量 * @param fpp 布隆过滤器误差率 * @param <T> * @return */ public static <T> BloomFilterHelper create(String key,Funnel<T> funnel, int expectedInsertions, double fpp){ if(LOCALBLOOM.containsKey(key)){ return LOCALBLOOM.get(key); }else{ synchronized (Lock){ if(LOCALBLOOM.containsKey(key)){ return LOCALBLOOM.get(key); }else{ RedisTemplate redisTemplate = getRedisTemplate(); if(redisTemplate==null){ return null; } BloomFilterHelper bloomFilterHelper=new BloomFilterHelper(key,funnel,expectedInsertions,fpp); LOCALBLOOM.put(key,bloomFilterHelper); CurrentBloomKey.set(key); BitArray bitArray =(BitArray) redisTemplate.opsForValue().get(key); return bloomFilterHelper; } } } } /** * 刷新布隆过滤器 */ public static void refreshBloom(){