缓存与性能优化
数据墙DBW 提供了两级缓存体系来减少数据库请求压力、提升高频查询的响应速度。你可以按全局或实体粒度灵活配置缓存策略。
一级缓存(L1)
一级缓存是进程内的内存缓存,访问速度最快,适合读多写少的场景:
json
{
"runtime": {
"cache": {
"enabled": true,
"ttl-seconds": 60
}
},
"entities": {
"Products": {
"source": "dbo.products",
"cache": {
"enabled": true,
"ttl-seconds": 30,
"level": "L1"
}
}
}
}一级缓存行为
- 按"路由 + 查询参数"维度缓存结果,相同请求直接命中内存。
- 当该实体发生 create、update 或 delete 操作时,相关缓存自动失效。
- 实体级
ttl-seconds会覆盖全局 TTL 值。 - 仅适用于 REST 端点。
一级缓存最适用于数据变动频率低、读取频繁的场景,例如产品目录、配置字典、地区列表等。
二级缓存(L2)
二级缓存通过 Redis 实现分布式缓存,解决多实例部署下的缓存共享问题:
json
{
"runtime": {
"cache": {
"enabled": true,
"ttl-seconds": 30,
"level-2": {
"enabled": true,
"provider": "redis",
"connection-string": "localhost:6379",
"partition": "prod-api"
}
}
}
}L1L2 组合模式
当实体配置为 "level": "L1L2"(默认级别)时,请求经过三级查找:
text
请求 → L1(内存)→ L2(Redis)→ 数据库 → 回写 L2 → 回写 L1 → 响应这意味着:
- 同一实例的后续请求从 L1 内存命中,几乎无延迟。
- 其他实例可以从 L2 获取结果并升温到自己的 L1。
- 容器重启后,L1 丢失但 L2 命中时仍可避免数据库查询。
分区隔离
通过 partition 参数可以为不同环境创建独立的缓存空间。只有配置相同分区值的实例才会共享缓存。这适用于:
- 隔离生产与测试流量。
- 多租户场景下的缓存空间划分。
- 防止无关服务的缓存互相污染。
HTTP 缓存头
数据墙DBW 支持标准的 HTTP 缓存头(Cache-Control、ETag 等),允许客户端和中间代理参与缓存决策。配置方式请参阅 HTTP 缓存配置参考。
缓存策略建议
| 场景 | 建议配置 |
|---|---|
| 单实例部署,读多写少 | L1,TTL 设为 30–120 秒 |
| 多实例水平扩展 | L1L2,搭配 Redis |
| 实时性要求高 | 关闭缓存或 TTL 设极短值 |
| 混合场景 | 按实体粒度差异化配置 |
