缓存三大问题

缓存穿透

缓存穿透指查询一个缓存和数据库中都不存在的数据,导致每次请求都落到数据库上。

解决方案

  1. 当查询到数据库中不存在的数据时,设置对应key,值为空的缓存。
  2. 使用布隆过滤器,过滤掉不存在的数据。

缓存雪崩

当所有的缓存key同时失效,比如redis挂了重启,此时大量请求同时访问,所有的请求都将直接落到数据库,数据库顶不住这么大的压力导致雪崩。

解决方案

  1. 线程互斥,比如使用synchronized字段,使得单台服务器下,只有一个线程去数据库查询数据并设置缓存。缺点是这种处理方式会降低系统的QPS
  2. 交错缓存的失效时间,实际实践的时候,缓存一般都是交错时间设置的。
  3. 针对首次启动,可以考虑缓存预热

缓存击穿

缓存雪崩的一个特例,当一个key值失效时,大量的请求涌入请求这个key的数据,导致所有的请求都落入到数据库。

解决方案

  1. 线程互斥