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();
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://zhoutianyu.blog.csdn.net/article/details/104848454
内容来源于网络,如有侵权,请联系作者删除!