在ModX中跨Snippet数组获取的缓存限制问题求助
解决方案
核心思路
通过给生成数组的Snippet(以下称Snippet B)配置7天有效期的全局缓存,确保它每周仅实际执行一次;非缓存的Snippet(以下称Snippet A)每次执行时直接调用Snippet B,复用其缓存的数组结果,同时满足数组不被A缓存的要求。
具体实现步骤
- 配置Snippet B的缓存规则:设置缓存有效期为7天,且缓存作用域为全局(应用级),这样所有请求都能共享同一缓存结果,避免重复执行数组生成逻辑。
- 在Snippet A中调用Snippet B:Snippet A保持非缓存状态,每次执行时直接调用Snippet B,此时会自动复用B的缓存结果,无需额外缓存数组。
伪代码示例
Snippet B(缓存,每周执行一次)
// 缓存配置:有效期7天,全局缓存 const generateWeeklyArray = cached({ expireAfter: 7 * 24 * 60 * 60 * 1000, scope: "global" }, () => { // 耗时的数组生成逻辑,每周仅执行一次 return [/* 生成的数组内容 */]; });
Snippet A(非缓存,每次执行调用B)
// 非缓存标记,确保每次请求都执行 const processData = uncached(() => { // 直接调用缓存的Snippet B,获取每周更新的数组 const weeklyArray = generateWeeklyArray(); // 后续业务处理逻辑 handleArrayData(weeklyArray); });
关键注意事项
- 必须确保Snippet B的缓存是全局作用域,不能是请求级或用户级,否则不同请求会触发重复执行。
- 缓存过期时间需精准设置为7天,避免提前刷新或延迟更新数组。
- 若数组生成逻辑依赖外部服务,需添加异常处理机制,防止缓存失效时Snippet A无法获取有效数据。
内容的提问来源于stack exchange,提问作者benni
相关产品推荐
相关产品推荐

