什么是缓存穿透:
前端用户要访问获取数据时,后端首先会在缓存Redis中查询,如果能查询到数据,则直接将数据返回给用户,流程结束;如果在缓存中没有查询到数据,则前往数据库中查询,此时如果能查询到数据,则将数据返回给用户,同时将数据塞入缓存中,流程结束,如果在数据库中没有查询到数据时,则返回Null,同时流程结束。这个正常查询缓存的流程刚开始看倒没有什么问题,但是仔细看最后一个步骤:“当查询数据库时如果没有查询到数据,则直接返回 Null给前端用户,流程结束”,如果前端频繁发起访问请求时,恶意提供数据库中不存在的Key,则此时数据库中查询到的数据将永远为Null。由于Null的数据是不存入缓存中的,因而每次访问请求时将查询数据库,如果此时有恶意攻击,发起“洪流”式的查询,则很有可能会对数据库造成极大的压力,甚至压垮数据库。这个过程称之为“缓存穿透”,顾名思义,就像是“永远越过了缓存而直接永远地访问数据库”。

如何解决缓存穿透:
目前业界有多种比较成熟的解决方案,其中比较典型的是改造图3.27中的最后一个步骤,即“当查询数据库时如果没有查询到数据,则将 Null返回给前端用户,同时将该Null数据塞入缓存中,并对对应的Key设置一定的过期时间,流程结束”。