##### 概念: 在默认情况下,用户请求数据时,会先在缓存(Redis)中查找,若没找到即缓存未命中,再在数据库中进行查找,数量少可能问题不大,可是一旦大量的请求数据(例如秒杀场景)缓存都没有命中的话,就会全部转移到数据库上,造成数据库极大的压力,就有可能导致数据库崩溃。网络安全中也有人恶意使用这种手段进行攻击被称为洪水攻击。 ##### **解决方案:** * 布隆过滤器 对所有可能查询的参数以Hash的形式存储,以便快速确定是否存在这个值,在控制层先进行拦截校验,校验不通过直接打回,减轻了存储系统的压力。 * 缓存空对象 一次请求若在缓存和数据库中都没找到,就在缓存中方一个空对象用于处理后续这个请求。 存在的问题 : 1、如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键。 2、即使对空值设置了过期时间,还是会存在 缓存层和存储层 的数据会有一段时间窗口的不一致的问题,对于需要保持一致性的业务会有影响。