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

网友投稿 954 2022-10-29

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

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

一、布隆过滤器

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

1、BloomFilter能解决什么问题?

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

二、实战

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

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

技术参考文档:RBloomFilter bloomFilter = redisson.getBloomFilter("sample");// 初始化布隆过滤器,预计统计元素数量为55000000,期望误差率为0.03bloomFilter.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 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(); }

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:dry - 一个用于管理Docker容器和镜像的终端应用程序
下一篇:资格评审
相关文章

 发表评论

暂时没有评论,来抢沙发吧~