import java.util.BitSet;
/**
* @Author: wangsheng
* @Description:
* @CreateDate: 2020/2/11 10:06
*/
public class BloomFilter {
public final int DEFAULT_SIZE = (1 << 31) - 1; // m的值
public final int[] seeds = new int[] { 9, 11, 13, 31, 37, 57 }; // 6个函数
public BitSet bits = new BitSet(DEFAULT_SIZE);
public BloomFilter.HashFunc[] func = new BloomFilter.HashFunc[seeds.length];
//单例模式
private static BloomFilter bloomFilter=new BloomFilter();
/**
* 创建过滤器
*/
public BloomFilter () {
for (int i = 0; i < seeds.length; i++) {
func[i] = new BloomFilter.HashFunc(DEFAULT_SIZE, seeds[i]);
}
}
public static BloomFilter getInstance()
{
return bloomFilter;
}
/**
* 添加样本数据
* @param value
*/
public void add(String value) {
for (BloomFilter.HashFunc f : func) {
bits.set(f.hash(value), true);
}
}
/**
* 删除样本数据
* @param value
*/
public void delete(String value) {
for (BloomFilter.HashFunc f : func) {
bits.clear(f.hash(value));
}
}
/**
* 删除所有
*/
public void deleteAll() {
bits.clear();
}
/**
* 判断是否存在
* @param value
* @return
*/
public boolean contains(String value) {
if (value == null) {
return false;
}
boolean ret = true;
for (BloomFilter.HashFunc f : func) {
ret = ret && bits.get(f.hash(value));
}
return ret;
}
/**
* 哈希函数
* @author Administrator
*
*/
public static class HashFunc {
private int maxCount;
private int seed;
public HashFunc(int maxCount, int seed) {
this.maxCount = maxCount;
this.seed = seed;
}
public int hash(String value) {
int result = 0;
int len = value.length();
for (int i = 0; i < len; i++) {
result = seed * result + value.charAt(i);
}
return (maxCount - 1) & result;
}
}
}
用法示例
public String getByBloomFilter(String key) {
//布隆过滤器检查无效key直接返回空
if (! BloomFilter.getInstance().contains(key)) {
return null;
}
//1、从redis中获取值
String dictValue = getFromRedis(key);
if (dictValue == null) {
//当redis中不存在时访问数据库
dictValue = DbService.loadData(key);
if (dictValue != null) {
//从数据库中加载数据并放入redis
setValueToRedis(key, dictValue);
//添加到bitmap中
BloomFilter.getInstance().add(key);
}
}
return dictValue;