缓存穿透是指查询一个一定不存在的数据,由于数据不存在,当先去缓存找数据时,发现不存在,就去数据库中找数据,发现数据库中也没有数据,就返回数据不存在,但没有写入缓存。这样,下次在来访问时缓存中还是没有,又到数据库中查询。例如,查询id等于-1的数据。当有人恶意攻击时,就会造成大量请求到数据库中查询,而缓存就时区了意义。流量大时,可能会导致数据库压力过大。
常见解决方案:
1.把查出来不存在的也存在缓存中,例如id等于-1,就把key=-1,value=null,放到缓存中。这样下次再拿-1查询的时候,就直接从缓存中拿,不会到数据库中查询。这些数据也不能一直存在于缓存中,所以可以设置过期时间。
2.使用布隆过滤器,他可以过滤出一定不存在的数据。
他是一个有一定长度的数组,数据都为0
假如要添加一个hello,会通过某种计算,比如hash1,得出1、hash2,得出3、hash3,得出8,数组下标为1、3、8的数据为0,说明数据不存在,返回并将对应的数组改为1。
假如要添加一个word,会通过某种计算,比如hash1,得出1、hash2,得出4、hash3,得出9,数组下标为4、9的数据为0,说明数据不存在,返回并将4、9的数组改为1。
假如要添加一个java,会通过某种计算,比如hash1,得出3、hash2,得出6、hash3,得出9,数组下标为6的数据为0,说明数据不存在,返回并将6的数组改为1。
假如要添加一个html,会通过某种计算,比如hash1,得出4、hash2,得出6、hash3,得出9,下标为4、6、9的数据都已经改为1了,说明这个数据可能存在,可是明明不存在,这就是布隆过滤器的误判,当数组越大时,我们误判的情况就越小。
通过上面我们可以看出,只要数据映射到的数组中一位是0的,那么就表明数据就一定不存在,因为没有任何一个数据去修改过数据为0的下标。
我们将所有数据库中的数据对应的key放到布隆过滤器中,然后当请求过来时,我们就先去缓存中查询,没有查到的话,就去布隆过滤器中判断是否存在,布隆过滤器能判断出一个数据一定不存在,所以当判断出不存在时,可直接返回,不必去数据库中查询数据。减轻出具库压力。
reids之缓存穿透
最新推荐文章于 2024-08-22 22:18:52 发布