不管是在工作中还是在面试的时候,我们经常会涉及到缓存穿透的问题,那么什么是缓存穿透呢?
缓存穿透顾名思义就是用户的一次请求,后端先检测缓存里是否存在,如果不存在,则去数据库里面取值,数据库也没有结果,则直接返回给客户端
那么在真实的线上应用里面,用户的请求是非常多的。如果用户进行恶意请求,同时这些结果在缓存里面没有,而且数据库也没有,那么就会一直请求到数据库,那么每次数据库没查到结果,那么一次次的都要请求到数据库,所以给后端带来没有必要的压力。
那么如何避免缓存穿透呢?
在网上大多数的文字性答案都是这样的:
第一种是使用布隆过滤器,但是布隆过滤器存在误算率。 第二种缓存空结果,设置一个空对象,推荐使用第二种。
具体图示如下:
但是这两种方案真的能解决缓存穿透的问题吗?如果用户端进行恶意请求,查询的都是不存在的信息,那么我们的缓存里面是不是就会导致大量无用的缓存呢?这个问题才是这篇文章想要阐述的重点。因为这个其实会产生两个比较大的问题:
1、缓存系统中会缓存大量无用的缓存。 2、后续如果有对应的数据信息存在,那么我们返回给前端仍然是无用的缓存信息,这样就会造成系统故障。
所以关于这个问题,我们可以在深入一下,就是在做无用的缓存的时候,再添加一个有效期,这样的话,也就只有在系统被恶意请求的时候才会出现大量无用的空对象缓存,等待恶意攻击情况环节智慧,大量无用的空对象缓存都会被删除掉。更改后的方案如下:
以上就是关于缓存穿透的一些看法。
还没有评论,来说两句吧...