Data API 建構器長期支援記憶體內快取 1L1 級及與快取相關的 HTTP 請求標頭,如 no-store、 no-cache,並 only-if-cached 影響快取行為。
第二層(L2)快取透過增加分散式快取層,將快取擴展至本地程序之外。 透過 L2,快取結果可在多個 DAB 實例間重複使用,且能承受個別容器重啟,使無狀態部署在各方面感覺不那麼無狀態。
層級 2 快取的優點
想用 2 級快取時可以:
- 在規模擴大的 DAB 實例間分享快取結果
- 減少重複讀取時的資料庫往返次數
- 回收或重新部署後,保持無狀態容器的溫度
- 提升對大量讀取工作負載的效能
- 命名空間快取與分割區的參與
設定執行時快取設定
第二層快取在全域配置下 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 的運作方式
小提示
簡而言之;DRL1L2 = 請求→ L1 → L2 →資料庫 → L2 → L1 → 回應
依預設,啟用快取的實體將使用層級 L1L2。
-
L1是每個程序的記憶體內部快取。 -
L2是分散式快取層,目前為 Redis,外加一個用於跨實例一致性的背板。
使用 L1L2,快取查冊首先檢查 L1。 未 L1 命中時,會檢查 L2 是否全域啟用並設定二級快取。 如果兩層都找不到該條目,DAB 會執行資料庫查詢。 結果隨後會同時儲存在 L1 和 L2中。
這表示:
- 同一實例上的未來請求則由本地伺服器提供
L1 - 其他實例的請求可以讀取
L2並提升該條目,成為自己的L1 - 如果容器重新啟動,
L1未中後接著命L2中仍可避免資料庫往返
這種組合能讓你在擴展或回收的實例間獲得溫暖的分散快取。
Redis 支援
Redis目前是二級快取的提供者。 它非常適合這種情況,因為它支援:
- 跨多個 DAB 實例的共享存取
- 基於 TTL 的快取金鑰到期
- 高吞吐量工作負載的快速讀寫
- 跨實例的背板協調
分割快取空間
請使用選用 partition 設定來隔離分散式快取活動。 DAB 利用分割值來命名 Redis 鍵與背板通道。 只有共享同一分割區的容器才會參與相同的分散快取空間。
這個設定在你想要:
- 生產與非生產運輸的分離
- 隔離租戶或環境
- 防止無關服務分享快取項目