首页 > 数据库 >redis-布隆过滤器(RBloomFilter)BloomFilter

redis-布隆过滤器(RBloomFilter)BloomFilter

时间:2023-03-27 23:33:17浏览次数:33  
标签:String redis 布隆 static result 过滤器 BloomFilter RBloomFilter

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

标签:String,redis,布隆,static,result,过滤器,BloomFilter,RBloomFilter
From: https://blog.51cto.com/u_15993308/6153343

相关文章

  • Redis分布式锁最牛逼的实现 Redlock
    普通实现说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道setkeyvaluepxmillisecondsnx。后一种方式的核心实现命令如下:-获取锁(unique_value可以是UUID等)SETr......
  • Redis 有序集合(sorted set)
    Redis有序集合(sortedset)Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通......
  • redisObject
    结构/**Redis对象*/typedefstructredisObject{//类型4bitsunsignedtype:4;//编码方式4bitsunsignedencoding:4;//LRU时间(相......
  • ASP.NET Core使用filter和redis实现接口防重
    背景日常开发中,经常需要对一些响应不是很快的关键业务接口增加防重功能,即短时间内收到的多个相同的请求,只处理一个,其余不处理,避免产生脏数据。这和幂等性(idempotency)稍微......
  • Redis 列表(List)
    Redis列表(List)Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含232-1个元素(4294967295,......
  • Redis 哈希(Hash)
    Redis哈希(Hash)Redishash是一个string类型的field(字段)和value(值)的映射表,hash特别适合用于存储对象。Redis中每个hash可以存储232-1键值对(40多亿)。实......
  • C# StackExchange.Redis 用法总结
    阅读目录安装 StackExchange.Redis引用及初始化String(字符串)List(列表)Hash(哈希)发布订阅事务Batch批量操作Lock(分布式锁)StackExchange.Redis封装安装 St......
  • redis hash类型操作
    Redis-Hash前言hash在很多编程语言中都有着很广泛的应用,而在Redis中也是如此,在redis中,哈希类型是指Redis键值对中的值本身又是一个键值对结构,形如value=[{field1,value1},......
  • Redis - 对象结构
    简介Redis使用对象存储数据库中的键和值,每当在Redis中创建一个新的键值对时,都会创建两个对象:一个是键对象,另一个是值对象。其中,Redis的每种对象都由对象结构和对应......
  • Redis进阶系统学习2——Redis数据操作
    第二部分:Redis数据操作Redis官网全部命令:https://redis.io/commandsRedis命令参考中文网:http://doc.redisfans.com/下面主要介绍一些常用数据操作命令6.键命令查看所有键......