使用 Redis Cluster 和 WXISME 实现布隆过滤器

130 阅读1分钟

1. WXISME

Maven 地址

在这里插入图片描述

2. 引入依赖

<dependency>
    <groupId>com.github.wxisme</groupId>
    <artifactId>bloomfilter</artifactId>
    <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <artifactId>jedis</artifactId>
            <groupId>redis.clients</groupId>
        </exclusion>
    </exclusions>
</dependency>

3. 实现代码

这里的 Redis Cluster 配置请参考:使用 Jedis 连接 Redis Cluster 集群

import com.github.wxisme.bloomfilter.bitset.RedisBitSet;
import com.github.wxisme.bloomfilter.common.BloomFilter;
import lombok.extern.slf4j.Slf4j;
import redis.clients.jedis.Client;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.util.JedisClusterCRC16;

import java.util.*;

/**
 * Redis Cluster 工具类
 *
 * @author wangbo
 * @date 2021/6/29
 */
@Slf4j
public class RedisClusterUtil {

    private RedisClusterUtil() {
    }

    /**
     * 向布隆过滤器中添加目标值
     *
     * @param key                      布隆过滤器的key值
     * @param value                    要添加到布隆过滤器中的值
     * @param falsePositiveProbability 期望的假阳性概率
     * @param expectedNumberOfElements 布隆过滤器中元素的预期数量
     */
    public static void addBloomValue(String key, String value, double falsePositiveProbability, int expectedNumberOfElements) {
        try {
            JedisCluster jedisCluster = JedisClusterManager.getJedis();
            BloomFilter<String> filter = new BloomFilter<>(falsePositiveProbability, expectedNumberOfElements);
            filter.bind(new RedisBitSet(jedisCluster, key));
            filter.add(value);
        } catch (Exception e) {
            log.error("redis cluster add bloom value error", e);
        }
    }


    /**
     * 判断布隆过滤器中是否存在目标值
     *
     * @param key                      布隆过滤器的key值
     * @param value                    目标值
     * @param falsePositiveProbability 期望的假阳性概率
     * @param expectedNumberOfElements 布隆过滤器中元素的预期数量
     * @return 判断结果,true存在,false不存在
     */
    public static boolean containsBloomValue(String key, String value, double falsePositiveProbability, int expectedNumberOfElements) {
        try {
            JedisCluster jedisCluster = JedisClusterManager.getJedis();
            BloomFilter<String> filter = new BloomFilter<>(falsePositiveProbability, expectedNumberOfElements);
            filter.bind(new RedisBitSet(jedisCluster, key));
            return filter.contains(value);
        } catch (Exception e) {
            log.error("redis cluster contains bloom value error", e);
            return false;
        }
    }

}