从头开始学Redisson--------布隆过滤器

x33g5p2x  于2021-12-28 转载在 其他  
字(1.4k)|赞(0)|评价(0)|浏览(422)

一、布隆过滤器

      Redisson利用Redis实现了Java分布式的布隆过滤器。因此,在多个JVM节点上或者是其他进程里面,Redisson可以通过同一个KEY获取到布隆过滤器。布隆过滤器的主要功能就是判断某个元素在不在容器里面。因此,布隆过滤器非常适合缓存穿透的场景,就是查询一个肯定不存在于DB中的数据。另外一个业务场景也很简单,就是可以判断是否重复。 一言以蔽之,可以用布隆过滤器来解决缓存穿透问题,也可以使用布隆过滤器来检查数据是否重复。

1、BloomFilter能解决什么问题?

      布隆过滤器可以用于检查一个元素是否在集合中。优点是查询速度与内存占用都要优于一般的 hash算法,缺点是有小几率的识别错误,以及删除元素比较困难。

二、实战

      业务场景很简单,就是插入一个用户到数据库中。但是不允许出现插入重复的用户名。

       如果真的要在生产环境里面用布隆过滤器,那么得单独开一个定时任务初始化布隆过滤器的数据。删除、更新的时候,都要重新刷新布隆过滤器,如此看来,好像确实不太好用。不如用Redis的Set类型。

技术参考文档:
RBloomFilter<SomeObject> bloomFilter = redisson.getBloomFilter("sample");
// 初始化布隆过滤器,预计统计元素数量为55000000,期望误差率为0.03
bloomFilter.tryInit(55000000L, 0.03);
bloomFilter.add(new SomeObject("field1Value", "field2Value"));
bloomFilter.add(new SomeObject("field5Value", "field8Value"));
bloomFilter.contains(new SomeObject("field1Value", "field8Value"));

       我的代码:

@PostMapping("/addUser")
    public Integer insert(@RequestBody MUser user) {

        RBloomFilter<String> bloomFilter
                = redisson.getBloomFilter(Constant.REDISSON_BLOOMFILTER_USER);
        //布隆过滤器计算的正确率为97%,初始化布隆过滤器容量为50000L
        bloomFilter.tryInit(500000L,0.03);
        if (bloomFilter.contains(user.getName())) {
            throw new InvalidArgumentException("用户名:" + user.getName() + "已经存在");
        }

        user.setId(null);
        int res = userMapper.insertSelective(user);
        if (res > 0) {
            //加入布隆过滤器
            bloomFilter.add(user.getName());
        }
        return user.getId();
    }

相关文章