0
点赞
收藏
分享

微信扫一扫

redis-布隆过滤器(RBloomFilter)BloomFilter

redis redisson 布隆过滤器(RBloomFilter)

导包

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.13.4</version>
</dependency>

demo

public class BloomFilter implements Serializable {


    public static void main(String[] args) {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://49.234.20.225:6379");
        //构造Redisson
        RedissonClient redisson = Redisson.create(config);
        RBloomFilter<String> bloomFilter = redisson.getBloomFilter("phoneList");
        //初始化布隆过滤器:预计元素为100000000L,误差率为3%
        bloomFilter.tryInit(100000000L, 0.03);
        //将号码10086插入到布隆过滤器中
        bloomFilter.add("10086");

        //判断下面号码是否在布隆过滤器中
        //输出false
        System.out.println(bloomFilter.contains("123456"));
        //输出true
        System.out.println(bloomFilter.contains("10086"));
    }

}
public class RedissonBloomFilterDemo {
  public static final int _1W = 10000;

  // 布隆过滤器里预计要插入多少数据
  public static int size = 100 * _1W;
  // 误判率,它越小误判的个数也就越少
  public static double fpp = 0.03;

  static RedissonClient redissonClient = null; // jedis
  static RBloomFilter rBloomFilter = null; // redis版内置的布隆过滤器

  @Resource RedisTemplate redisTemplate;

  static {
    Config config = new Config();
    config.useSingleServer().setAddress("redis://127.0.0.1:6379").setDatabase(0);
    // 构造redisson
    redissonClient = Redisson.create(config);
    // 通过redisson构造rBloomFilter
    rBloomFilter = redissonClient.getBloomFilter("phoneListBloomFilter", new StringCodec());

    rBloomFilter.tryInit(size, fpp);

    // 1测试  布隆过滤器有+redis有
    // rBloomFilter.add("10086");
    // redissonClient.getBucket("10086",new StringCodec()).set("chinamobile10086");

    // 2测试  布隆过滤器有+redis无
    // rBloomFilter.add("10087");

    // 3 测试 ,布隆过滤器无+redis无

  }

  private static String getPhoneListById(String IDNumber) {
    String result = null;

    if (IDNumber == null) {
      return null;
    }
    // 1 先去布隆过滤器里面查询
    if (rBloomFilter.contains(IDNumber)) {
      // 2 布隆过滤器里有,再去redis里面查询
      RBucket<String> rBucket = redissonClient.getBucket(IDNumber, new StringCodec());
      result = rBucket.get();
      if (result != null) {
        return "i come from redis: " + result;
      } else {
        result = getPhoneListByMySQL(IDNumber);
        if (result == null) {
          return null;
        }
        // 重新将数据更新回redis
        redissonClient.getBucket(IDNumber, new StringCodec()).set(result);
      }
      return "i come from mysql: " + result;
    }
    return result;
  }

  private static String getPhoneListByMySQL(String IDNumber) {
    return "chinamobile" + IDNumber;
  }

  public static void main(String[] args) {
    // String phoneListById = getPhoneListById("10086");
    // String phoneListById = getPhoneListById("10087"); //请测试执行2次
    String phoneListById = getPhoneListById("10088");
    System.out.println("------查询出来的结果: " + phoneListById);

    // 暂停几秒钟线程
    try {
      TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    redissonClient.shutdown();
  }
}

guava 工具布隆过滤器(BloomFilter)

依赖

<dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>29.0-jre</version>
</dependency>

代码

public class BloomFilterCase {
    // 预计要插入多少数据
    private static int size = 1000000;
    //期望的误判率
    private static double fpp = 0.01;
    /**
     * 布隆过滤器
     * Funnels.integerFunnel()  只能判断整数
     * Funnels.stringFunnel(Charsets.UTF_8) String类型
     */
    private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, fpp);
    public static void main(String[] args) {
        // 插入10万样本数据
        for (int i = 0; i < size; i++) {
            bloomFilter.put(i);
        }
        // 用另外十万测试数据,测试误判率
        int count = 0;
        for (int i = size; i < size + 100000; i++) {
            if (bloomFilter.mightContain(i)) {
                count++;
                System.out.println(i + "误判了");
            }
        }
        System.out.println("总共的误判数:" + count);
    }
}

举报

相关推荐

0 条评论