1. 各种 Web 缓存技术包含哪些部分?
想象一下,你在一家咖啡店:
你需要一杯咖啡(资源),但每次都重新制作会很慢。在 Web 开发中,缓存技术就像是将咖啡提前准备好,以便快速提供给顾客(用户)。
(1) 核心组成部分
浏览器缓存:
浏览器会缓存静态资源(如 HTML、CSS、JavaScript、图片)以减少重复请求。示例:Cache-Control: max-age=3600
CDN 缓存:
内容分发网络(CDN)会在全球范围内的边缘节点缓存资源,加速用户的访问速度。示例:https://cdn.example.com/image.jpg
服务器缓存:
Web 服务器(如 Nginx、Apache)或应用服务器(如 Node.js、PHP)可以缓存动态生成的内容。示例:proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m;
数据库缓存:
数据库查询结果可以被缓存,避免重复执行耗时的 SQL 查询。示例:SELECT * FROM users WHERE id = 1; -- 第一次查询后缓存结果
内存缓存:
使用内存缓存(如 Redis、Memcached)存储频繁访问的数据,提高读取速度。示例:const redisClient = require('redis').createClient();
redisClient.set('user:1', JSON.stringify(user));
HTTP 缓存头:
HTTP 协议提供了多种缓存控制机制,通过响应头实现缓存策略。常见头部:
Cache-Control:指定缓存的有效时间和行为。ETag:为资源生成唯一标识符,用于验证缓存是否有效。Expires:指定资源的过期时间。Last-Modified:记录资源的最后修改时间。
示例:Cache-Control: public, max-age=86400
ETag: "abc123"
2. 使用场景是什么?
(1) 静态资源加速
场景:缓存静态文件(如 CSS、JavaScript、图片)以减少服务器负载。示例:Cache-Control: max-age=31536000
(2) 动态内容缓存
场景:缓存动态生成的内容(如 API 响应、HTML 页面)以提高性能。示例:proxy_cache_valid 200 302 10m;
(3) 全球化内容分发
场景:通过 CDN 将内容分发到离用户更近的边缘节点,降低延迟。示例:https://cdn.example.com/assets/style.css
(4) 数据库查询优化
场景:缓存数据库查询结果以减少重复查询的开销。示例:cached_result = cache.get('user_list')
if not cached_result:
cached_result = db.query("SELECT * FROM users")
cache.set('user_list', cached_result)
(5) 会话状态管理
场景:使用内存缓存存储用户的会话数据(如登录状态)。示例:redisClient.set(`session:${sessionId}`, JSON.stringify(userData), 'EX', 3600);
(6) 实时数据缓存
场景:缓存实时性要求较低的数据(如天气信息、新闻列表)。示例:const weatherData = await redisClient.get('weather');
if (!weatherData) {
weatherData = await fetchWeatherAPI();
redisClient.set('weather', JSON.stringify(weatherData), 'EX', 600);
}
3. 底层原理是什么?
(1) HTTP 缓存机制
强制缓存:
使用 Cache-Control 和 Expires 指定资源的缓存时间。示例:Cache-Control: max-age=3600
浏览器在缓存时间内直接使用本地副本,无需向服务器发送请求。
协商缓存:
使用 ETag 或 Last-Modified 验证缓存是否有效。示例:If-None-Match: "abc123"
如果资源未改变,服务器返回 304 Not Modified,浏览器使用缓存。
(2) CDN 工作原理
边缘节点缓存:
CDN 将资源缓存在靠近用户的边缘节点,减少主服务器的压力。
缓存刷新:
当源站资源更新时,CDN 会自动或手动刷新缓存。
(3) 内存缓存
键值存储:
内存缓存(如 Redis、Memcached)以键值对形式存储数据。
过期策略:
支持 TTL(Time To Live)设置,自动清理过期数据。
(4) 数据库缓存
查询缓存:
数据库引擎(如 MySQL)会缓存查询结果。
应用层缓存:
使用 ORM(如 Sequelize、Hibernate)或中间件缓存查询结果。
(5) 性能优化
减少网络延迟:
缓存减少了客户端与服务器之间的往返次数。
降低服务器负载:
缓存减少了对后端服务的请求频率。
4. 图示说明
(1) HTTP 缓存流程
用户请求 -> 浏览器检查缓存 -> 是否命中缓存?
|
v
是 -> 直接返回缓存内容
否 -> 向服务器请求资源 -> 返回新资源并更新缓存
(2) CDN 缓存结构
+--------------------------+
| 用户请求 | -> 最近的边缘节点
+--------------------------+
| 边缘节点缓存 | -> 源站
+--------------------------+
| 源站资源 |
+--------------------------+
(3) 内存缓存工作流程
用户请求 -> 检查内存缓存 -> 是否命中缓存?
|
v
是 -> 返回缓存数据
否 -> 查询数据库 -> 更新缓存并返回数据
5. 总结
(1) 核心组成部分
浏览器缓存:减少重复请求。CDN 缓存:加速全球化内容分发。服务器缓存:缓存动态内容。数据库缓存:优化查询性能。内存缓存:存储高频访问数据。HTTP 缓存头:控制缓存策略。
(2) 使用场景
静态资源加速。动态内容缓存。全球化内容分发。数据库查询优化。会话状态管理。实时数据缓存。
(3) 底层原理
HTTP 缓存机制:强制缓存和协商缓存。CDN 工作原理:边缘节点缓存和源站同步。内存缓存:键值存储和过期策略。数据库缓存:查询缓存和应用层缓存。性能优化:减少网络延迟和服务器负载。