在邊緣儲存資料
AEM Edge函式通常需要將資料放在邊緣、貼近訪客,並在函式叫用中重複使用,而不需要往返至來源。 AEM Edge函式透過 KV存放區 提供此邊緣資料存放區。
KV存放區是您在執行階段讀取和寫入的機碼值存放區。 其資料會在函式叫用之間持續存在,因此您AEM Edge函式程式碼的任何部分都可以讀取其他部分先前撰寫的內容。 用它來快取運算結果、保留重新導向對應,或跨請求共用資料。
何時使用KV存放區
不同於您在部署時設定且唯讀的configs,KV存放區在執行階段會讀取和寫入。 已為您的AEM Edge功能布建一個kv_default存放區,且其任何模組或端點可以讀寫至該存放區。
configsedgeFunctions.yaml中進行部署時config_defaultkv_default啟用KV存放區
將edgeFunctions.yaml中data下的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存放區範例: