数据 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 键和背板通道。 只有共享同一分区的容器参与同一分布式缓存空间。
若要:
- 分隔生产和非生产流量
- 隔离租户或环境
- 阻止不相关的服务共享缓存的条目