前言:
眼前你们对“java实现防碰撞算法代码”大致比较注意,朋友们都想要学习一些“java实现防碰撞算法代码”的相关文章。那么小编在网上收集了一些关于“java实现防碰撞算法代码””的相关文章,希望看官们能喜欢,各位老铁们一起来了解一下吧!布隆过滤器防止缓存穿透。
今天给大家分享一下使用布隆过滤器解决Redis缓存穿透问题。
·一、布隆过滤器常用场景。首先通过一张图了解一下什么是布隆过滤器,它实际上是有一个很长的二进制向量,可以把它理解成为一个二进制数组,只能存放0和1,0代表不存在,1代表存在和一系列的随机函数。这个随机函数可以理解为hash函数。
想向布隆过滤器添加元素,比如这里的张三,那么就需要通过hash算法算出张三对应的下标,将下标的值存入到二进制的数组当中。说明一下,这里存储的不是元素本身,并且有多个hash函数,多个hash函数可以减少hash碰撞次数,降低重复率。
由于它的数据特点,它的优点和缺点都是比较明显的。它的优点是空间效率和查询时间都比一般算法要好。它的缺点就是误判率还有删除困难。由于使用hash算法必然会有hash冲突,所以误判率和删除困难是必然的。
布隆过滤器的特点能够判断一个数据可能在集合中或者一个数据绝对不在集合中。利用这一特点有以下几个应用场景:网页URL去重、垃圾邮件的判别,还有最常用的缓存穿透问题,在guava、hutool、redission都有布隆过滤器的实现。
接下来就看一下在项目中结合redission如何防止缓存穿透。看一下代码示例,这是一个spring boot项目,以查询产品为例,看一下redission中布隆过滤器的使用。这里有两个接口,一个是根据ID查询产品,还有一个添加产品接口。
看一下查询方法。首先需要查询布隆过滤器,防止缓存穿透。如果布隆过滤器存在,继续查询Redis。如果Redis存在,直接返回,否则就查询数据库,将数据保存到Redis当中,然后再返回。如果布隆过滤器不存在,就可以直接进行返回了。
这里有一点需要说明的是,布隆过滤器是在项目启动的时候就进行了初始化。看一下初始化的方法,先删除,然后再初始化布隆过滤器。
·最后将产品ID添加到布隆过滤器,这边有两个参数,一个是预期插入量,还有预期错误率,这个需要根据实际情况进行调整。并且查询方法如果数据量过大也可以采用异步的方式。
看一下产品的添加方法,数据添加成功后需要保存到redis一份,并且向布隆过滤器中添加一下数据。最后通过定时任务刷新布隆过滤器的数据,目的是为了刷新那些被删除掉的产品。
最后有需要视频中源码的小伙伴关注并回复。
标签: #java实现防碰撞算法代码 #redission问题