redis实现布隆过滤器


    @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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序少年不秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值