全部產品
Search
文件中心

Edge Security Acceleration:Cache API

更新時間:Oct 29, 2024

Cache API是一種快取資料的方法。通過Cache API,您可以在邊緣節點上快取資料,以便在下次請求時快速返回資料。Cache API可以設定緩衝時間和緩衝大小,以便更好地控制緩衝策略。

工作原理

通過ER內建的CacheAPI,您可以將ER處理後的結果或從來源站點擷取的資料緩衝到ESA,供其他訪問到同節點的請求複⽤,以減少重複的計算或⽹絡請求。ER和ESA緩衝的關係示意圖如下:工作原理

API標準

Cache基本儘可能地遵循標準 Cache。但由於邊緣程式是複用ESA已有的Cache引擎,所以最終語意尚無法做到完全一致。

API定義

cache.put(request/string, response)

  • 將一個Response對象,緩衝到Cache中。

    • 如果put成功,resolve成undefined。

    • 如果由於Cache引擎失敗,reject成error異常。

    • 如果由於Cache引擎的quota超用,reject成error異常。

  • 緩衝的key設定為 request對象的URL 或者直接用string表示URL。(請使用HTTP協議的URL,目前由於ESA Cache引擎的原因不支援設定HTTPS協議的URL)。

  • 這個是個非同步函數,可調用await確保put完成。

  • Response對象可以設定cache-control頭用於配置Cache的TTL(cache-control頭設定符合Cache標準)。

樣本

  • 儲存內容到Cache。

    async function doPut() {
      await cache.put("http://www.example.com", new Response("Hello World"));
      new Response("Hello World", {headers: [["cache-control", "max-age=10"]]})); 
    }
  • 儲存內容到Cache並且設定ttl。

    async function doPut() {
      await cache.put("http://www.example.com", new Response("Hello World"));
      await cache.put("http://www.example.com", 
      new Response("Hello World", {headers: [["cache-control", "max-age=10"]]})); 
    }

cache.get(request/string)

  • 獲得一個key為輸入request/string的Response對象(如果對象不存在,resolve成undefined)。

  • 這個是個非同步函數,可調用await確保get完成。

  • get有可能無法返回剛剛put的對象,因為緩衝的LRU演算法,Cache不保證一定可以取到。

樣本

  • cache.get獲得一個Response對象。

    async function doGet() {
        let resp = await cache.get("http://www.example.com");
    }
  • 儲存的結果解析成JSON。

    async function doGet() {
        let resp = await cache.get("http://www.example.com");
        let j = await resp.json();
    }

cache.delete(request/string)

  • 刪除一個key為輸入的Response對象。

    • 如果刪除成功,resolve成true。

    • 如果刪除失敗,則resolve成false。

  • 這個是個非同步函數,調用await確保delete完成。

樣本(刪除key下的資源)

async function doDelete() {
  let resp = await cache.delete("http://www.example.com");
  
  if (resp) {
        console.alert("done");
  } else {
        console.alert("failed");
  }
}

使用限制

  • 以上所有的請求都是子請求,所以共用ER子請求個數的限制。預設一個ER請求的fetch子請求最多不超過32個(這個數字可能將在ER商業化時發生變化)。由於Cache的所有API操作也是子請求,所以他們和fetch共用32個子請求的約束,即cache.put+cache.get+cache.delete+fetch在一個Request上下文中不能超過32個。

  • cache.put、cache.get和cache.delete都有concurrency control,即針對同一個URL,某個請求在get,另外一個請求在delete的時候,get或者delete有可能返回pending狀態,即該請求目前無法完成(多個並發請求都在同時修改同一個key下的資源導致),建議稍等後重試。

    說明

    cache.put、cache.get和cache.delete reject成true時,表示該操作被concurrency control。

緩衝重新整理

通過CacheAPI存入的緩衝暫不支援主動重新整理,您需要在Cache.put()存入緩衝時通過TTL參數指定合適的緩衝時間。