本文主要介绍一下缓存雪崩、缓存穿透、缓存击穿三者的区别,以及如何避免。
缓存雪崩
缓存承担了大量的查询请求,有力的保护了数据库,但是某一时刻,缓存的数据全部失效,或者缓存宕机,导致所有的查询都落入到了数据库上,数据库突然收到暴增的流量,严重会导致数据库宕机。
解决方案:
- 设置缓存失效时间时,加入随机值,避免大量缓存同时失效。
- 使用redis集群。
- 对后端资源的访问,比如数据库,使用限流工具。
缓存穿透
缓存穿透是查询一个不存在的数据,在缓存上没有命中,程序接着访问数据库,数据库也没有命中,同时查询完数据库后缓存也没有写入数据。
当出现大量的这种请求时,这些请求都会打到数据库上,严重会造成数据库宕机。
解决方案:
- 访问缓存前使用布隆过滤器过滤请求;
- 缓存这些不存在的数据;
- 分析不存在数据的规则,在程序中对其过滤。
缓存击穿
某一个热点key过期瞬间,大量对该key的查询请求会落入到数据库上,导致数据库压力倍增。
造成缓存击穿的原因有以下两个:
- 该数据没有人查询过 ,第一次就大并发的访问。(冷门数据)
- 添加到了缓存,reids有设置数据失效的时间 ,这条数据刚好失效,大并发访问(热点数据)
解决方案:
- 缓存未命中时,对该key加锁,确保只有一个线程访问数据库,从数据库查询回来后解锁,其他加锁失败的线程等待直到解锁。