外观
缓存拦截器 💾
功能介绍 💡
INFO
缓存拦截器用于缓存API响应数据,提高系统性能和响应速度。支持灵活的缓存规则配置、TTL管理和自动清理机制。
应用场景
- ✓ API响应缓存,减少后端服务压力
- ✓ 静态数据缓存,提升用户体验
- ✓ 高频访问接口优化
- ✓ 数据库查询结果缓存
配置说明 ⚙️
基础配置参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| enabled | boolean | 否 | false | 是否启用缓存拦截器 |
| default-ttl | string | 否 | 5m | 默认缓存过期时间,支持时间单位:s(秒)、m(分钟)、h(小时) |
| default-max-size | int | 否 | 1000 | 默认最大缓存条目数量,0表示无限制 |
| cleanup-interval | string | 否 | 1m | 过期缓存清理间隔 |
| rules | array[object] | 否 | - | 缓存规则列表 |
缓存规则配置 (rules)
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | 规则名称,用于标识和管理 |
| urls | array[string] | 是 | 需要缓存的URL模式列表 |
| forbid-urls | array[string] | 否 | 禁止缓存的URL模式列表 |
| ttl | string | 否 | 缓存过期时间,为空时使用默认值 |
| max-size | int | 否 | 最大缓存条目数量,为0时使用默认值 |
| headers | array[string] | 否 | 需要包含在缓存键中的请求头列表 |
| query-params | array[string] | 否 | 需要包含在缓存键中的查询参数列表,空表示包含所有参数 |
| ignore-query-params | array[string] | 否 | 需要忽略的查询参数列表 |
TIP
URL匹配规则详见 URL匹配规则说明
配置示例 📝
基础配置
yaml
gateway:
filter:
cache:
enabled: true # 启用缓存
default-ttl: "5m" # 默认5分钟过期
default-max-size: 1000 # 默认最大1000条缓存
cleanup-interval: "1m" # 每分钟清理一次过期缓存
rules:
- name: "api-cache" # 规则名称
urls:
- "/api/user/info" # 缓存用户信息接口
- "/api/config/*" # 缓存配置相关接口
ttl: "10m" # 10分钟过期高级配置
yaml
gateway:
filter:
cache:
enabled: true
default-ttl: "5m"
default-max-size: 2000
cleanup-interval: "30s"
rules:
# 用户数据缓存
- name: "user-data"
urls:
- "/api/user/profile"
- "/api/user/settings"
forbid-urls:
- "/api/user/password" # 密码相关接口不缓存
ttl: "15m"
max-size: 500
headers:
- "Authorization" # 根据用户token区分缓存
query-params:
- "userId" # 只考虑userId参数
# 静态数据缓存
- name: "static-data"
urls:
- "/api/dict/*" # 字典数据
- "/api/menu/*" # 菜单数据
ttl: "1h" # 1小时过期
max-size: 100
ignore-query-params:
- "timestamp" # 忽略时间戳参数
- "_t"
# 商品信息缓存
- name: "product-cache"
urls:
- "/api/product/list"
- "/api/product/detail/*"
ttl: "30m"
headers:
- "X-Merchant-Id" # 根据商户ID区分缓存
query-params: [] # 包含所有查询参数性能优化配置
yaml
gateway:
filter:
cache:
enabled: true
default-ttl: "3m"
default-max-size: 5000
cleanup-interval: "2m"
rules:
# 高频接口短时间缓存
- name: "high-frequency"
urls:
- "/api/search/*"
- "/api/recommend/*"
ttl: "1m" # 1分钟短缓存
max-size: 1000
# 低频接口长时间缓存
- name: "low-frequency"
urls:
- "/api/system/info"
- "/api/version"
ttl: "24h" # 24小时长缓存
max-size: 50统一过期时间策略 ⏰
功能说明
统一过期时间策略是一种缓存同步机制,通过将缓存的过期时间对齐到固定的时间窗口,确保多个服务实例的缓存能够同步过期,避免缓存不一致问题。
工作原理
- 时间窗口对齐:将缓存的过期时间对齐到TTL大小的时间窗口边界
- 统一过期:同一时间窗口内的所有缓存项将在同一时间点过期
- 自动计算:系统自动根据当前时间和TTL计算对齐后的过期时间
计算公式
对齐后的过期时间 = 当前时间 + TTL - (当前时间 % TTL)示例说明
假设当前时间为 14:23:30,TTL为 5分钟:
- 原始过期时间:
14:28:30(当前时间 + 5分钟) - 对齐后过期时间:
14:25:00(对齐到5分钟的时间窗口边界)
这样确保了所有在 14:20:00-14:25:00 时间窗口内创建的缓存都会在 14:25:00 统一过期。
优势特点
- ✅ 缓存同步:多实例缓存同步过期,避免数据不一致
- ✅ 自动管理:无需额外配置,系统自动应用策略
- ✅ 性能优化:减少缓存清理的频率和开销
- ✅ 简化运维:统一的过期时间便于监控和管理
缓存键生成规则 🔑
缓存键由以下部分组成:
- 请求方法 (GET)
- 请求路径 (URL路径部分)
- 查询参数 (根据配置包含或排除)
- 请求头 (根据配置包含特定头部)
基础缓存键
请求: GET /api/user/info?userId=123×tamp=1640995200
配置: query-params: ["userId"], ignore-query-params: ["timestamp"]
基础缓存键: GET:/api/user/info?userId=123注意事项 ⚠️
1. 数据一致性
- 缓存可能导致数据不一致问题
- 重要业务数据谨慎使用缓存
- 考虑缓存失效和更新机制
2. 内存使用
- 监控缓存内存使用情况
- 合理设置max-size限制
- 定期清理过期缓存
3. 安全考虑
- 敏感数据不应缓存
- 用户相关数据需要隔离
- 避免缓存包含敏感信息的响应
4. 性能影响
- 缓存命中率影响性能提升效果
- 过多的缓存规则可能影响匹配性能
- 合理设置cleanup-interval
常见问题 ❓
缓存不生效
排查步骤:
- 检查enabled是否为true
- 验证URL匹配规则是否正确
- 确认请求方法是否支持缓存
- 检查forbid-urls是否排除了该URL
内存占用过高
解决方案:
- 减少max-size设置
- 缩短TTL时间
- 优化缓存规则,避免缓存大响应
- 增加cleanup-interval频率
数据不一致
处理方法:
- 缩短相关接口的TTL时间
- 在数据更新时清理相关缓存
- 考虑使用主动失效机制
- 评估是否适合使用缓存
性能提升不明显
优化建议:
- 分析缓存命中率
- 检查缓存的数据大小
- 优化缓存键生成规则
- 调整缓存策略