Skip to content

缓存拦截器 💾

功能介绍 💡

INFO

缓存拦截器用于缓存API响应数据,提高系统性能和响应速度。支持灵活的缓存规则配置、TTL管理和自动清理机制。

应用场景

  • ✓ API响应缓存,减少后端服务压力
  • ✓ 静态数据缓存,提升用户体验
  • ✓ 高频访问接口优化
  • ✓ 数据库查询结果缓存

配置说明 ⚙️

基础配置参数

参数名类型必填默认值说明
enabledbooleanfalse是否启用缓存拦截器
default-ttlstring5m默认缓存过期时间,支持时间单位:s(秒)、m(分钟)、h(小时)
default-max-sizeint1000默认最大缓存条目数量,0表示无限制
cleanup-intervalstring1m过期缓存清理间隔
rulesarray[object]-缓存规则列表

缓存规则配置 (rules)

参数名类型必填说明
namestring规则名称,用于标识和管理
urlsarray[string]需要缓存的URL模式列表
forbid-urlsarray[string]禁止缓存的URL模式列表
ttlstring缓存过期时间,为空时使用默认值
max-sizeint最大缓存条目数量,为0时使用默认值
headersarray[string]需要包含在缓存键中的请求头列表
query-paramsarray[string]需要包含在缓存键中的查询参数列表,空表示包含所有参数
ignore-query-paramsarray[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

统一过期时间策略 ⏰

功能说明

统一过期时间策略是一种缓存同步机制,通过将缓存的过期时间对齐到固定的时间窗口,确保多个服务实例的缓存能够同步过期,避免缓存不一致问题。

工作原理

  1. 时间窗口对齐:将缓存的过期时间对齐到TTL大小的时间窗口边界
  2. 统一过期:同一时间窗口内的所有缓存项将在同一时间点过期
  3. 自动计算:系统自动根据当前时间和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 统一过期。

优势特点

  • 缓存同步:多实例缓存同步过期,避免数据不一致
  • 自动管理:无需额外配置,系统自动应用策略
  • 性能优化:减少缓存清理的频率和开销
  • 简化运维:统一的过期时间便于监控和管理

缓存键生成规则 🔑

缓存键由以下部分组成:

  1. 请求方法 (GET)
  2. 请求路径 (URL路径部分)
  3. 查询参数 (根据配置包含或排除)
  4. 请求头 (根据配置包含特定头部)

基础缓存键

请求: GET /api/user/info?userId=123&timestamp=1640995200
配置: query-params: ["userId"], ignore-query-params: ["timestamp"]
基础缓存键: GET:/api/user/info?userId=123

注意事项 ⚠️

1. 数据一致性

  • 缓存可能导致数据不一致问题
  • 重要业务数据谨慎使用缓存
  • 考虑缓存失效和更新机制

2. 内存使用

  • 监控缓存内存使用情况
  • 合理设置max-size限制
  • 定期清理过期缓存

3. 安全考虑

  • 敏感数据不应缓存
  • 用户相关数据需要隔离
  • 避免缓存包含敏感信息的响应

4. 性能影响

  • 缓存命中率影响性能提升效果
  • 过多的缓存规则可能影响匹配性能
  • 合理设置cleanup-interval

常见问题 ❓

缓存不生效

排查步骤:

  1. 检查enabled是否为true
  2. 验证URL匹配规则是否正确
  3. 确认请求方法是否支持缓存
  4. 检查forbid-urls是否排除了该URL

内存占用过高

解决方案:

  1. 减少max-size设置
  2. 缩短TTL时间
  3. 优化缓存规则,避免缓存大响应
  4. 增加cleanup-interval频率

数据不一致

处理方法:

  1. 缩短相关接口的TTL时间
  2. 在数据更新时清理相关缓存
  3. 考虑使用主动失效机制
  4. 评估是否适合使用缓存

性能提升不明显

优化建议:

  1. 分析缓存命中率
  2. 检查缓存的数据大小
  3. 优化缓存键生成规则
  4. 调整缓存策略

相关文档 📚