在邊緣儲存資料

IMPORTANT
AEM Edge功能目前仍在測試階段。 功能和檔案可能會變更。 如需意見回饋,請連絡aemcs-edgecompute-feedback@adobe.com
NOTE
沙箱程式中無法使用設定、密碼和KV存放區。 使用非沙箱環境或RDE來測試KV存放區。

AEM Edge函式通常需要將資料放在邊緣、貼近訪客,並在函式叫用中重複使用,而不需要往返至來源。 AEM Edge函式透過​ KV存放區 ​提供此邊緣資料存放區。

KV存放區是您在執行階段讀取和寫入的機碼值存放區。 其資料會在函式叫用之間持續存在,因此您AEM Edge函式程式碼的任何部分都可以讀取其他部分先前撰寫的內容。 用它來快取運算結果、保留重新導向對應,或跨請求共用資料。

何時使用KV存放區

不同於您在部署時設定且唯讀的configs,KV存放區在執行階段會讀取和寫入。 已為您的AEM Edge功能布建一個kv_default存放區,且其任何模組或端點可以讀寫至該存放區。

configs
kv存放區
存取
在執行階段為唯讀
在執行階段讀取和寫入
設定者
您在edgeFunctions.yaml中進行部署時
在執行階段中的函式程式碼
存放區名稱
config_default
kv_default
用於
每個環境的靜態設定
在執行階段變更的資料

啟用KV存放區

edgeFunctions.yamldata下的kvs: true設定為functions的同層級。 這個切換會為AEM Edge函式布建kv_default存放區。

# config/edgeFunctions.yaml
kind: "EdgeFunctions"
version: "1"
data:
  functions:
    - name: my-edge-function
  kvs: true # enable the KV store

透過Cloud Manager設定管道或RDE上的aio aem rde:install -t env-config ./config部署更新的設定。 如需詳細資訊,請參閱在AEM as a Cloud Service上設定AEM Edge函式在Edge Delivery Services上設定AEM Edge函式

讀取和寫入程式碼

開啟kv_default存放區,然後呼叫get(key)put(key, value, options?)。 兩個呼叫均為非同步。 值以字串形式儲存,因此寫入時可使用JSON.stringify()序列化物件。 讀取時,get(key)傳回的專案會公開text()json()arrayBuffer(),因此呼叫entry.json()以剖析儲存的物件。

// src/index.js or handler file
import { KVStore } from "fastly:kv-store";

// open the KV store
const kv = new KVStore("kv_default");

// write a value (serialize objects to a string)
await kv.put("greeting", JSON.stringify({ text: "Hello from the edge" }));

// read a value (get returns an entry, or null when the key is missing)
const entry = await kv.get("greeting");
const value = entry ? await entry.json() : null;

使用KV存放區快取資料

常見的模式是快取區隔開。 處理常式會先從KV存放區讀取,並只會在未命中時呼叫後端。 將ttl (以秒為單位)傳遞至put(),而存放區會為您讓專案過期,因此您不會自行追蹤到期日。

// src/lib/cache.js
import { KVStore } from "fastly:kv-store";

const kv = new KVStore("kv_default");

// Read a cached value, or null when the key is missing or expired
export async function getCached(key) {
  const entry = await kv.get(key);
  return entry ? await entry.json() : null;
}

// Cache a value; the store expires it after ttlSeconds
export async function setCached(key, payload, ttlSeconds) {
  await kv.put(key, JSON.stringify(payload), { ttl: ttlSeconds });
}

在處理常式中,讀取快取,遺漏時退回後端,然後將結果寫回。

let data = await getCached("inventory:west");
if (!data) {
  data = await fetchFromBackend();
  await setCached("inventory:west", data, 60); // store expires the entry after 60 seconds
}

填入KV存放區

KV存放區在edgeFunctions.yaml中沒有部署時間植入。 您的函式程式碼會在執行階段寫入每個值。 兩種常見的方法是:

  • 隨選。 在第一次請求專案時填入專案,如上述的快取旁模式一樣。
  • 透過維護端點。 公開可重新建立專案的端點,然後依排程呼叫它。 這適用於大型且變更緩慢的資料集,例如重新導向地圖。

准則

  • 在程式碼讀取或寫入存放區之前,使用kvs: true啟用存放區。
  • 此存放區由您的所有AEM Edge函式程式碼共用。 使用前置詞的金鑰名稱空間,例如redirect:inventory:,因此不同的模組或端點不會發生衝突。
  • 金鑰名稱區分大小寫。
  • 值為字串。 使用JSON.stringify()序列化物件並在讀取時剖析它們。
  • 處理遺失的金鑰。 當索引鍵不存在時,get()會傳回null
  • KV存放區最終是一致的。 在寫入之後,讀取會短暫地傳回先前的值,因此避免依賴寫入後讀取來進行關鍵邏輯。

完成範例

AEM Edge函式範例存放庫包含具有完整config/和程式碼的KV存放區範例:

範例
存放庫
它顯示的內容
重新導向地圖查閱
publish-delivery-redirect-map
在請求時從KV存放區讀取重新導向目標、透過維護端點重新建置共用的對應專案,並在遺失時退回原點

其他資源

recommendation-more-help
experience-manager-learn-help-cloud-service