2024-05-02
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/5748197065

回答

缓存穿透是指请求一个根本不存在的数据(不在缓存中也不在数据库中),由于数据在数据库也不存在所以就无法加载到缓存中,这就导致这个不存在的数据每次请求都要到数据库里面去查询,给数据库带来了不必要的访问压力。如果这类请求非常频繁,这会严重影响数据库的性能,甚至会使数据库奔溃。

缓存穿透的发生一般是这两种情况

  • 业务误操作。比如数据库和缓存中的数据被误删了,导致数据库和缓存中都没有数据了。
  • 黑客攻击。比如黑客估计访问大量不存在的业务数据。

应对缓存穿透,常见的方案有三种。

一、过滤非法请求

在 API 入口增加请求参数的判断,判断参数是否合理、参数中是否有非法值、必要请求字段是否存在等等校验手段,如果判断是恶意请求就直接返回错误,避免请求进一步到缓存和数据库。

二、缓存空值

如果查询数据库数据不存在时,则在缓存中存储空值(或默认值),这样当再次访问相同的不存在的数据时,可以直接返回缓存中的空值(或默认值),不需要再次访问数据库。但是,这个空值的过期时间不宜设置的太长。