@Autowired
private RedisTemplate redisTemplate;
private int bitSetSize;
private int addedElements;
private int hashFunctionNumber;
//redisKey
private String redisKey = null;
/**
* 构造一个布隆过滤器,过滤器的容量为c * n 个bit.
*
* @param redisKey redisKey(键)
* @param c 当前过滤器预先开辟的最大包含记录,通常要比预计存入的记录多一倍.
* @param n 当前过滤器预计所要包含的记录.
* @param k 哈希函数的个数,等同每条记录要占用的bit数.
*/
public RedisBloomFilterAbstract(String redisKey,int c, int n, int k) {
this.hashFunctionNumber = k;
this.bitSetSize = (int) (c * k);
this.addedElements = n;
this.redisKey = redisKey;
}
/**
* 向布隆过滤器中添加一个字符串
* @param value 字符串
* @return 是否加入成功,如果存在就返回true,不存在就返回false
*/
private boolean addByBloomFilter(String value) {
if (includeByBloomFilter(value)) {
return false;
}
int[] offset = BitSetBloomFilter.createHashes(value, hashFunctionNumber);
for (int i : offset) {
int position = Math.abs(i % bitSetSize);
redisTemplate.opsForValue().setBit(redisKey, position, true);
}
return true;
}
/**
* 判断是否包含该字符串
* 布隆过滤器本身就有误差(容错率)
* @param value 校验值
* @return false=不存在, true=存在
*/
private boolean includeByBloomFilter(String value) {
int[] offset = BitSetBloomFilter.createHashes(value, hashFunctionNumber);
for (int i : offset) {
int position = Math.abs(i % bitSetSize);
if (!redisTemplate.opsForValue().getBit(redisKey, position)) {
return false;
}
}
return true;
}
ArticleBloomFilter
@Component
public class ArticleBloomFilter extends RedisBloomFilterAbstract{
//哈希函数的个数,等同每条记录要占用的bit数.
private static final int HASH_NUM = 3;
//当前过滤器预计所要包含的记录.
private static final int EL_NUM = 8000000;
//当前过滤器预先开辟的最大包含记录,通常要比预计存入的记录多一倍.
private static final int MAX_EL_NUM = EL_NUM*2;
//redis-key
public static final String ARTICLE_REDIS_KEY = RedisKeyConstant.BLOOMFILTER;
public ArticleBloomFilter(){
super(ARTICLE_REDIS_KEY,EL_NUM, MAX_EL_NUM, HASH_NUM);
}
@Override
public double getFalsePositiveProbability() {
return super.getFalsePositiveProbability();
}
@Override
public boolean add(String val) {
return super.add(val);
}
@Override
public boolean[] addMulti(String... values) {
return super.addMulti(values);
}
@Override
public boolean exists(String value) {
return super.exists(value);
}
@Override
public boolean[] existsMulti(String... values) {
return super.existsMulti(values);
}
}