zoukankan      html  css  js  c++  java
  • 大型缓存架构实战

    大型缓存架构实战

    1. 缓存架构层级

    一般的电商网站的读并发非常的高,而且不同商品的热度不同,适合采用多级的缓存架构,比较经典的三级缓存:nginx本地缓存 + redis分布式缓存 + tomcat堆缓存

    1-1. nginx本地缓存

    对于热点数据,可以缓存在nginx本地,这样对于这些热数据的大量访问,直接走nginx就行了,不需要后续的各种网络开销

    1-2. redis分布式缓存

    redis分布式缓存,可以抗住大量的离散访问,支持海量数据,高并发的访问,高可用的服务.利用redis cluster的多master写入,横向扩容,几十万的QPS,99.99%的高可用,可以抗住大量的离散访问请求.

    1-3. tomcat堆缓存

    最后的容灾处理,如果redis出现了大规模的宕机,导致nginx大量流量直接涌入数据生成服务,那么tomcat堆内存缓存至少可以再抗一下,同时tomcat的jvm堆内存缓存,也可以抗住redis没有cache的最后那少量的缓存

    2. 通用的缓存模式Cache Aside Pattern

    • 读操作时,先读缓存,缓存中没有,再去读数据库,然后取出数据后放入缓存,同时返回响应
    • 写操作时,先删除缓存,再更新数据库
      • 在高并发的情况下,也可能会发生数据双写不一致问题
        比如第一个请求过来修改数据,先删除了缓存,正要去修改数据库,还没修改
        这时第二个请求过来,去读缓存,此时缓存为空,然后它就去查询数据库,并将数据库中的数据放入缓存
        在第二个请求将原始数据放入缓存中后,第一个请求才完成数据库的修改,此时数据库和缓存中的数据就不一样了.
      • 解决方法:将没有命中缓存的读操作和写操作一起根据key值hash到同一个内存队列(如ArrayBlockingQueue)中去,按照顺序执行
  • 相关阅读:
    二分图的部分关系
    二分图的部分关系
    日常训练赛 Problem C – Complete Naebbirac’s sequence
    日常训练赛 Problem C – Complete Naebbirac’s sequence
    J
    J
    Python strip()方法
    Python startswith()方法
    Python splitlines()方法
    Python split()方法
  • 原文地址:https://www.cnblogs.com/Serenity1994/p/12708331.html
Copyright © 2011-2022 走看看