- 缓存穿透
key对应的缓存不存在,此时程序会触发读取数据源,如果并发量较大,可能会持续亚到DB。
解决方案:如果发现数据库不存在记录,可以把空结果缓存到Redis,这样就减少了DB的压力。
- 缓存击穿
key对应的缓存已过期,此时如果大量并发请求,系统发现缓存过期,会重新从DB中加载数据到Redis,此时可能会瞬间把DB压垮。(感觉这个挺极端的场景😝)
解决方案:
方案1:从DB中加载缓存的时候,使用分布式锁,只允许一个线程加载缓存;
方案2:使用key查询缓存只负责查询缓存,不从DB加载,使用定时任务定时刷新缓存,这样两个人任务分离
- 缓存雪崩
在某一段时间内,缓存集中过期,导致全部请求都打在数据库,数据库压力过大服务崩溃。
解决方案:
方案一:Redis缓存过期时间增加随机数据,不要都集中在同一时段过期
方案二:双缓存策略,有两个缓存主缓存和备用缓存,主缓存失效时读取备用缓存,异步更新主缓存,备用缓存失效时间设置长一些。
具体采用哪个方案,还需看具体需求,然后做取舍。