后端与接口
为无头 VTEX 店面实现缓存策略:区分可缓存与不可缓存…
在构建或优化无头 VTEX 店面时,为公开只读 API 配置 CDN/BFF 缓存、为交易与个人数据禁用缓存,并设置 TTL 与失效策略。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
为无头 VTEX 店面实现缓存策略:区分特定
解决思路
- 在实现缓存逻辑前,先将每个 VTEX API 分类为可缓存或不可缓存:可缓存(公开、只读、非个性化)包括 Intelligent Search、Catalog 公开端点、top searches、autocomplete;不可缓存(交易性、个性化、敏感)包括 Checkout、Profile、OMS、Payments、Pricing 私有端点,这些在任何层都绝不能缓存。
- 使用 stale-while-revalidate 模式:先立即返回缓存数据,同时在后台刷新,以平衡新鲜度与性能。
- 使用中等 TTL(2-15 分钟)并结合事件驱动的失效机制;绝不要在没有失效机制的情况下设置数小时或数天的 TTL。
- 仅按请求 URL/参数作为缓存键,不要按用户身份缓存——同一 trade policy 下所有匿名用户的目录数据相同。
- 分层缓存:对前端直接调用的 Search 使用 CDN 边缘缓存,对代理的目录数据使用 BFF 缓存(Redis 或内存)。
- 按推荐 TTL 配置:Intelligent Search product_search 为 2-5 分钟、SWR 60s;Catalog 分类树为 5-15 分钟、SWR 5 分钟;Intelligent Search autocomplete 为 1-2 分钟、SWR 30s;Intelligent Search top searches 为 5-10 分钟、SWR 2 分钟;Catalog 产品详情为 5 分钟、SWR 60s。
- 对 Checkout(/api/checkout/)、Profile(/api/profile-system/pvt/)、OMS(/api/oms/pvt/orders)、Payments(/api/payments/)、Pricing 私有(/api/pricing/pvt/)设置 no-store、no-cache、must-revalidate、proxy-revalidate 以及 Surrogate-Control: no-store 等响应头,确保任何层都不缓存。
- 必须积极缓存公开 API 数据:Search 结果、Catalog 数据、分类树等公开只读数据必须在 CDN、BFF 或两者中缓存,避免每个请求直接打到 VTEX API 导致 429 错误、增加 200-500ms 延迟。
- 在 BFF 中实现带 TTL 与 SWR 的内存缓存:记录 staleAt 与 expiresAt,命中且未过期时返回 HIT,过期但在 SWR 窗口内返回 STALE 并后台刷新,未命中则拉取并写入缓存。
- 为每个缓存实现明确的失效策略:设置合理 TTL,并提供强制失效机制,例如受 API key 保护的手动失效端点(支持按 productId 或 pattern=all 清除)以及接收 VTEX 目录变更事件的 webhook 端点。
- 在 CDN 边缘函数中仅缓存 GET 请求到 Intelligent Search:先查 caches.default.match,未命中则 fetch 并设置 Cache-Control: public, max-age=120, stale-while-revalidate=60,再写入 CDN 缓存。
- 实现 Redis 版 BFF 缓存工具 getCachedOrFetch:读取缓存并检查 TTL,若处于 SWR 窗口则返回 STALE 并后台刷新,否则返回 HIT;未命中则拉取并 setex 写入;同时提供 invalidateCache(pattern) 按模式删除键。
- 按路由组应用缓存中间件:/api/bff/catalog 使用 public 缓存头(public, max-age=120, stale-while-revalidate=60, Vary: Accept-Encoding),/api/bff/checkout、/api/bff/orders、/api/bff/profile 使用 no-cache 头。
- 避免按 session 或用户身份缓存:不要用 user ID 作为目录数据缓存键,否则存储量按用户数倍增且失去缓存意义;若需按 trade policy 定价,将 trade policy(而非 user ID)纳入缓存键。
- 避免设置极长 TTL 且无失效:数小时或数天的 TTL 会导致价格变更、库存更新和新产品对购物者不可见;使用 2-15 分钟中等 TTL 配合事件驱动失效与 SWR。
- 添加缓存可观测性:为每个缓存响应添加 X-Cache 头,并跟踪 hits、misses、stale 指标与命中率,以便判断缓存是否有效及 TTL 是否合适。
- 按审查清单自检:公开只读 API 是否已缓存;交易/个人 API 是否显式 no-store;所有缓存是否有界 TTL;是否有失效机制;缓存键是否基于请求参数而非用户身份;是否使用 SWR;TTL 是否适中;是否有缓存可观测性。
适用边界 · 注意事项
- 不要将此技能用于 BFF 架构与 API 路由决策(应使用 headless-bff-architecture)。
- 不要将此技能用于 Intelligent Search API 集成细节(应使用 headless-intelligent-search)。
- 不要将此技能用于 Checkout 代理与 OrderForm 管理(应使用 headless-checkout-proxy)。