Node.js flat-cache缓存清除时机及Express服务落地咨询
关于flat-cache缓存清除时机的实用方案(适配你的Node.js+MySQL场景)
嘿,结合你这个对接MySQL的Express服务场景,我来分享几个靠谱的flat-cache缓存清除时机方案,你可以根据业务需求选:
数据变更时主动清除(最推荐)
既然你的缓存数据来自MySQL,那当产品数据发生新增、修改、删除操作时,就应该立刻清除对应客户的缓存,这是保证缓存与数据库数据一致的最精准方式。
比如在你的POST/PUT/DELETE接口里,完成数据库操作后直接调用flat-cache的清除方法:// 示例:更新产品的接口中清除对应缓存 router.put('/products/update/:customer_id', async (req, res) => { // 1. 先执行MySQL更新逻辑 await db.query('UPDATE products SET ... WHERE customer_id = ?', [req.params.customer_id]); // 2. 清除该客户的产品缓存 const cacheKey = `products_${req.params.customer_id}`; cache.removeKey(cacheKey); cache.save(); // 务必记得保存缓存变更 res.json({ success: true, msg: '产品更新成功' }); });定时过期自动清除
如果你的产品数据更新频率不高,或者可以接受1小时/几小时的延迟,那可以给缓存加个过期时间。flat-cache本身没有内置过期机制,你可以自己实现:router.get('/all/:customer_id', (req, res, next) => { const cacheKey = `products_${req.params.customer_id}`; const cachedContent = cache.getKey(cacheKey); // 校验缓存是否存在且未过期(比如设置1小时有效期) const expireTime = 3600 * 1000; if (cachedContent && Date.now() - cachedContent.timestamp < expireTime) { return res.json(cachedContent.data); } // 缓存失效或不存在,查询数据库并更新缓存 db.query('SELECT * FROM products WHERE customer_id = ?', [req.params.customer_id], (err, results) => { if (err) return next(err); cache.setKey(cacheKey, { data: results, timestamp: Date.now() }); cache.save(); res.json(results); }); });手动触发清除(辅助手段)
可以加一个仅限管理员访问的接口,用来手动清除指定客户或全部缓存,适合临时排查问题或定期维护:// 清除指定客户的缓存 router.post('/admin/clear-cache/:customer_id', (req, res) => { // 这里可以加管理员权限校验逻辑 const cacheKey = `products_${req.params.customer_id}`; cache.removeKey(cacheKey); cache.save(); res.json({ msg: `客户${req.params.customer_id}的缓存已清除` }); }); // 清除全部缓存 router.post('/admin/clear-all-cache', (req, res) => { cache.clear(); cache.save(); res.json({ msg: '全部产品缓存已清除' }); });服务器重启时清除(可选)
如果你的缓存不需要跨服务器重启持久化,可以在服务启动时调用cache.clear(),不过flat-cache默认会把缓存存在本地文件里,重启后依然保留,所以这个场景只适合临时缓存的需求。
总结一下:优先用数据变更时主动清除来保证数据一致性;如果无法监听数据变更,再用定时过期方案;手动清除作为辅助工具即可。
内容的提问来源于stack exchange,提问作者codeinprogress
相关产品推荐
相关产品推荐

