在边缘存储数据
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 store示例: