0%

Redis-缓存击穿、雪崩、穿透

缓存雪崩

原因:

大量Key同时过期或Redis宕机,请求直接访问数据库造成巨大压力,影响数据库性能及系统稳定性

解决方案:

  • 大量Key同时过期

    • 过期时间设置策略,避免Key同时全部失效
    • 互斥锁:保证同一时刻只有一个请求构建缓存,构建后是否锁,其他请求此刻阻塞或返回空
    • 双Key策略:设置主从Key,主Key设置过期时间,备用Key永不过期,主Key过期时返回备Key数据,主Key构建完数据时同步更新备Key数据
    • 后台缓存更新:将数据同步功能解耦,通过MQ或Cannal方式更新数据
  • redis宕机

    • 服务熔断或请求限流:降低请求量或直接返回空环境服务器压力
    • 构建集群:Redis集群

缓存击穿

原因:

某个热点数据过期,大量请求访问无法直接在缓存获取数据,导致直接访问数据库

解决方案:

  • 互斥锁或后台更新:不设置过期时间或快过期时通知后台线程更新

缓存穿透

原因:

访问Redis与Database中都不存在的数据,无法根据当前请求构建缓存数据,造成应用压力

解决方案:

  • 限制非法请求
    • 避免恶意请求专门访问增加服务器压力,通过接口API参数判断请求参数合理性
  • 缓存指定默认值或设置空值
    • 直接设置访问请求的Result为null并进行定时缓存,使后面请求可访问缓存数据
  • 布隆过滤器
    • 可快速查询数据是否存在,避免通过查询Database判断增加数据库压力。落库时使用布隆过滤器记录,确保缓存失效时查询的数据是否真实存在
    • 注:存在误判情况,结果不准确