1. 缓存穿透
通过某个key比如A进行查询时,每次都不能从缓存中获取到数据,因此每次都是访问数据库进行查询(数据库中也没有)。
解决方案
当key值A从数据库未查询到数据时,在缓存中将A的值设为空并设置过期时间。
2. 缓存击穿
某个热点key A在高并发的请求的情况下,缓存失效的瞬间,大量请求击穿缓存访问数据库。
解决方案
- 1.业务允许的情况下,热点数据不过期;
- 2.构建互斥锁,在第一个请求创建完成缓存后再释放锁,从而其他请求可以通过key访问缓存;
3. 缓存雪崩
雪崩是指缓存中大量数据过期导致系统涌入大量查询请求时,因大部分数据在Redis层已经失效,请求渗透到数据库层,大批量请求引起数据库压力造成查询堵塞甚至宕机。
代码层面,设置数据过期时间:
- 1.数据失效时间分散,不要在同一个时间大量缓存数据失效;
- 2.业务允许的情况下,数据不失效;
架构层面:
- 1.redis高可用,Redis Cluster,主从同步,避免redis全盘奔溃;
- 2.缓存分级,ehcache + redis + mysql模式,本地内存中无数据再从redis中查找;再者,MySQL实现限流和降级,避免宕机。
- 3.redis必须要持久化,重启后从磁盘加载数据,快速恢复缓存数据;