Redis 缓存穿透、缓存击穿和缓存雪崩【比较及解决方案】
① 缓存穿透。大量的无效请求穿透缓存打到数据库上,给数据库造成巨大压力。什么是无效请求?就是根本不存在的数据。
解决方案:对空值也做缓存,为了不影响正常业务,记得设置一个较短的过期时间;对于一定不存在的 key 用布隆过滤器过滤掉,从而避免对数据库的访问。
② 缓存击穿。某个热点数据突然过期失效,刚好这个时候有大量的请求被打过来,那么只能去数据库里查,大并发的请求可能会瞬间把数据库压垮。
解决方案:使用并发锁或队列来控制访问数据库的线程数量;设置永不过期。
③ 缓存雪崩。大量的缓存集中在某一时间同时失效,这样也是大量的请求被直接打到数据库上。与缓存击穿的区别:击穿是某一个 key,雪崩是很多 key。
解决方案:使用并发锁或队列来控制访问数据库的线程数量;将缓存失效时间分散开,不同的 key 设置不同的过期时间。