實作層級 2 快取

Data API 建構器長期支援記憶體內快取 1L1 級及與快取相關的 HTTP 請求標頭,如 no-storeno-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 會執行資料庫查詢。 結果隨後會同時儲存在 L1L2中。

這表示:

  • 同一實例上的未來請求則由本地伺服器提供 L1
  • 其他實例的請求可以讀取 L2 並提升該條目,成為自己的 L1
  • 如果容器重新啟動, L1 未中後接著命 L2 中仍可避免資料庫往返

這種組合能讓你在擴展或回收的實例間獲得溫暖的分散快取。

Redis 支援

Redis目前是二級快取的提供者。 它非常適合這種情況,因為它支援:

  • 跨多個 DAB 實例的共享存取
  • 基於 TTL 的快取金鑰到期
  • 高吞吐量工作負載的快速讀寫
  • 跨實例的背板協調

分割快取空間

請使用選用 partition 設定來隔離分散式快取活動。 DAB 利用分割值來命名 Redis 鍵與背板通道。 只有共享同一分割區的容器才會參與相同的分散快取空間。

這個設定在你想要:

  • 生產與非生產運輸的分離
  • 隔離租戶或環境
  • 防止無關服務分享快取項目

另請參閱