Web 多级缓存架构

基本思路

在整个网络系统架构的各层设置缓存,避免无效的网络通信,节省带宽、降低延迟。

  • 读多写少场景下,将读写分离

  • 分层缓存

    • 客户端
    • 应用层
    • 服务层
    • 数据层

Web 客户端缓存

  • 通过 HTTP 的 HEADER 控制
    • 可以设置图片、CSS、JS、字体,这些静态资源的过期时间,过期前会直接利用缓存资源
    • Expires 设置具体的资源过期时间
    • Cache-Control

应用层缓存

  • 可以在 CDN/Nginx 设置 Expires/Cache-Control 响应头

  • CDN(Content Delivery Network, 内容分发网络)

    • 通过智能 DNS根据客户端 IP 就近获得 CDN 结点并获取资源文件
    • 如果资源文件不存在,则 CDN 结点回源获取资源
  • Nginx

    • 直接设置静态资源的缓存,可以自动实现压缩

服务层缓存

  • 进程内缓存

    • 本地内存缓存,如 Java 的 EhCache
  • 进程外缓存(Redis)

    • 基于内存型 NoSQL 数据库
  • 多级缓存取值逻辑: 由近到远;由快到慢。

  • 多级缓存数据一致性问题 如果数据库更新,需要通过 MQ 向应用服务推送变更消息。 这要求允许一定程度的不一致

什么情况用多级缓存?

  1. 缓存的数据是稳定的(只读的)
  2. 瞬时可能产生极高并发的场景
  3. 一定程度上允许数据不一致(MQ/TTL 实现同步)