基本思路
在整个网络系统架构的各层设置缓存,避免无效的网络通信,节省带宽、降低延迟。
-
读多写少场景下,将读写分离
-
分层缓存
- 客户端
- 应用层
- 服务层
- 数据层
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 向应用服务推送变更消息。 这要求允许一定程度的不一致
什么情况用多级缓存?
- 缓存的数据是稳定的(只读的)
- 瞬时可能产生极高并发的场景
- 一定程度上允许数据不一致(MQ/TTL 实现同步)