缓存雪崩
原因:
大量Key同时过期或Redis宕机,请求直接访问数据库造成巨大压力,影响数据库性能及系统稳定性
解决方案:
大量Key同时过期
- 过期时间设置策略,避免Key同时全部失效
- 互斥锁:保证同一时刻只有一个请求构建缓存,构建后是否锁,其他请求此刻阻塞或返回空
- 双Key策略:设置主从Key,主Key设置过期时间,备用Key永不过期,主Key过期时返回备Key数据,主Key构建完数据时同步更新备Key数据
- 后台缓存更新:将数据同步功能解耦,通过MQ或Cannal方式更新数据
redis宕机
- 服务熔断或请求限流:降低请求量或直接返回空环境服务器压力
- 构建集群:Redis集群
缓存击穿
原因:
某个热点数据过期,大量请求访问无法直接在缓存获取数据,导致直接访问数据库
解决方案:
- 互斥锁或后台更新:不设置过期时间或快过期时通知后台线程更新
缓存穿透
原因:
访问Redis与Database中都不存在的数据,无法根据当前请求构建缓存数据,造成应用压力
解决方案:
- 限制非法请求
- 避免恶意请求专门访问增加服务器压力,通过接口API参数判断请求参数合理性
- 缓存指定默认值或设置空值
- 直接设置访问请求的Result为null并进行定时缓存,使后面请求可访问缓存数据
- 布隆过滤器
- 可快速查询数据是否存在,避免通过查询Database判断增加数据库压力。落库时使用布隆过滤器记录,确保缓存失效时查询的数据是否真实存在
- 注:存在误判情况,结果不准确