大型缓存架构实战

大型缓存架构实战

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)中去,按照顺序执行
原文地址:https://www.cnblogs.com/Serenity1994/p/12708331.html