通过


实现级别 2 缓存

数据 API 生成器长期支持级别 1 (L1) 内存中缓存和缓存相关的 HTTP 请求标头,no-cache例如no-store,并only-if-cached影响缓存行为。

级别 2 (L2) 缓存通过添加分布式缓存层来扩展缓存超出本地进程。 借助 L2缓存的结果,可以在多个 DAB 实例中重复使用,并且可以在单个容器重启后幸存下来,这使得无状态部署在所有正确的方式上都感觉不那么无状态。

级别 2 缓存的优点

想要以下情况下使用级别 2 缓存:

  • 跨横向扩展 DAB 实例共享缓存结果
  • 减少重复读取的数据库往返次数
  • 回收或重新部署后保持无状态容器暖化
  • 提高读取密集型工作负荷的性能
  • 命名空间缓存与分区的参与

配置运行时缓存设置

级别 2 缓存在全局下 runtime.cache配置。 运行时缓存块启用缓存,设置默认生存时间(TTL),并配置分布式缓存提供程序。

{
  "runtime": {
    "cache": {
      "enabled": true,
      "ttl-seconds": 30,
      "level-2": {
        "enabled": true,
        "provider": "redis",
        "connection-string": "localhost:6379",
        "partition": "prod-api"
      }
    }
  }
}

运行时属性

财产 说明
enabled 全局启用缓存支持。
ttl-seconds 设置默认缓存生存时间(以秒为单位)。
level-2.enabled 打开分布式缓存层。
level-2.provider 选择分布式缓存提供程序。 目前 redis 受支持。
level-2.connection-string Redis 实例的连接字符串。
level-2.partition Redis 键和背板通道的可选命名空间。 只有使用相同的分区的容器共享相同的分布式缓存空间。

配置特定于实体的缓存行为

实体可以替代全局缓存行为。 使用实体 cache 块启用缓存、设置自定义 TTL 并选择缓存级别。

{
  "entities": {
    "Products": {
      "source": "dbo.Products",
      "cache": { "enabled": true, "ttl-seconds": 120, "level": "L1L2" }
    },
    "Orders": {
      "source": "dbo.Orders",
      "cache": { "enabled": true, "level": "L1" }
    }
  }
}

cache.level 属性

用于 cache.level 控制实体使用的缓存层。

价值 说明
L1 仅内存中缓存。 快速和本地到当前 DAB 进程。
L1L2 内存中和分布式缓存。 此级别是缓存实体的默认级别。

如果未 L2 全局启用,则配置有 L1L2 行为方式的 L1实体。

L1L2 的工作原理

小窍门

Tl;DRL1L2 = 请求 → L1 → L2 → 数据库→ L2 → L1 → 响应

默认情况下,启用了缓存的实体使用级别 L1L2

  • L1 是针对每个进程的内存缓存。
  • L2 是分布式缓存层,目前为 Redis,以及用于跨实例一致性的背板。

使用 L1L2时,缓存查找首先检查 L1。 错过时 L1 ,它会检查 L2 是否全局启用并配置了级别 2 缓存。 如果在任一层中找不到条目,DAB 将执行数据库查询。 然后,结果将存储在这两 L1 个和 L2中。

也就是说:

  • 同一实例上的将来请求从本地提供 L1
  • 其他实例上的请求可以读取 L2 条目并将其提升为自己的条目 L1
  • 如果容器重启, L1 则命中后 L2 跟命中仍可避免数据库往返

此组合提供跨横向扩展或回收实例的暖分布式缓存。

Redis 支持

Redis 是级别 2 缓存的当前提供程序。 它非常适合此方案,因为它支持:

  • 跨多个 DAB 实例共享访问
  • 基于 TTL 的缓存的密钥过期
  • 高吞吐量工作负荷的快速读取和写入
  • 跨实例的背板协调

分区缓存空间

使用可选 partition 设置隔离分布式缓存活动。 DAB 使用分区值来命名空间 Redis 键和背板通道。 只有共享同一分区的容器参与同一分布式缓存空间。

若要:

  • 分隔生产和非生产流量
  • 隔离租户或环境
  • 阻止不相关的服务共享缓存的条目

另见