
微信小程序本地缓存不是万能的,wx.setStorage 写入失败时不会抛异常,而是走 fail 回调,很多人没监听就以为写进去了。尤其在 iOS 上,如果用户主动清理微信缓存或系统空间不足,wx.getStorage 可能直接返回 errMsg: "getStorage:fail data not found"。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
wx.setStorage 都必须写 fail 回调,记录错误日志(比如上报到自己的监控接口)res.data 是否存在且非空字符串,避免 JSON.parse 报错session_key 有效性"v2_user_profile_" + uid,便于灰度更新时自动失效旧数据小程序端缓存只是“快”,但不可信;PHP 后端缓存才是“稳”。常见错误是把所有逻辑都压到前端,结果用户改本地时间、清缓存、换设备后状态全乱。正确做法是:前端只缓存非关键、可降级的数据(如商品列表、配置项),PHP 用 Redis 存真实状态,并设置合理过期时间。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
cache_sign 字段(比如 md5(serialize($data) . $timestamp)),小程序存起来;下次请求前比对本地缓存的 sign,不一致就主动丢弃并重拉"wx:user:profile:12345",避免 key 冲突和扫描困难Redis::setex() 而非 set(),强制设置过期,防止脏数据长期滞留wx.setStorageSync 看似“同步”,其实底层仍是异步 I/O,只是阻塞当前 JS 线程。真机(尤其是低端安卓)上,如果连续高频调用(比如在 onShow 里反复 set),可能触发微信的写入限频策略,导致部分写入静默失败,且无任何提示。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
wx.setStorageSync('cache_bundle', { a: 1, b: 2, ts: Date.now() })
wx.getStorageSync 检查是否已存在且内容一致,减少冗余 I/O小程序默认会对 GET 请求做 HTTP 缓存(基于响应头),但微信底层不完全遵循标准,比如 Cache-Control: no-cache 有时被忽略。单纯靠前端加时间戳参数(?t=123)又污染 URL、浪费 CDN 流量。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
header('Cache-Control: no-store, must-revalidate');,注意不能只写 no-cache
etag 字段(如 md5 输出内容),小程序下次请求时通过自定义 header(如 X-If-None-Match)传回,PHP 判断是否命中再决定返回 304 或完整数据缓存不是开关,是权衡:前端快但脆弱,PHP 稳但有延迟,Redis 居中但要防雪崩。最易被忽略的是——没有缓存淘汰策略的代码,上线三天后就开始拖慢整个接口。