Redis-高并发缓存架构


  • 缓存击穿&缓存穿透&缓存雪崩
  • 热点KEY的缓存重建
  • 双写不一致&读写并发不一致
  • 写多读多

  • 缓存击穿:缓存集体失效导致某一时刻大量请求打到数据库
    • 随机缓存失效时间
    • 读延期:阻塞该数据的访问,直到缓存重新建立
  • 缓存穿透:请求数据库不存在的数据(缓存肯定也不存在)
    • 恶意攻击,并发请求不存在的商品ID,导致数据库宕机
      • 布隆过滤器:返回不存在则一定不存在,只能添加不能更新(定期重新初始化)
      • 缓存空对象并设置失效时间(避免缓存被长时间占满):避免布隆过滤器哈希碰撞
  • 缓存雪崩:缓存层宕机或无法正常提供服务(超大并发)
    • 热点中的热点导致超大并发请求:本地缓存(多级缓存)
      • 热点探测系统维护缓存内容并通知更新本地缓存 :分布式大数据实时计算
      • MQ或ZK通知更新本地缓存:数据短暂不一致,增加系统复杂度
    • 服务层限流熔断降级
    • 提高缓存层可用性
    • 提前压测

  • 热点KEY的缓存重建 & 冷门商品突然变热:大量线程同时重建缓存导致数据库宕机
    • 商品分布式锁双重检测:保证重建缓存时只查一次库
      • 使用trylock避免双重检测时长期等待
  • 缓存数据不一致:ABA问题
    • 缓存与数据库双写不一致
    • 读写并发不一致(发生概率偏低,因为查的速度一般快于写)
    • 解决方案
      • 写库和查库(重建缓存)之前使用分布式读写锁
      • 延时双删:写库后延时删两次缓存,不推荐用这种方式解决小概率事件浪费大量性能
      • canal:模拟MySQL从库监听binlog,更新缓存,引入中间件增加了系统复杂性
  • 写多读多场景
    • MQ直接操作数据库
    • 缓存作为主存储,异步同步到数据库
  • 放入缓存的数据应该是对实时性、一致性要求不是很高的数据。切记不要为了用缓存,同时又要保证绝对的一致性做大量的过度设计和控制,增加系统复杂性!


文章作者: 钱不寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 钱不寒 !
  目录