在边缘存储数据

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 store示例:

示例
存储库
它展示的内容
重定向映射查找
publish-delivery-redirect-map
在请求时从KV存储中读取重定向目标,通过维护端点重新构建共享映射条目,并在未命中时回退到原点

其他资源

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