如何在Node.js中针对动态值更新Redis缓存?
解决方案
先修正你现有代码的几个关键问题(Redis操作是异步的,且存储对象需要序列化处理):
// 假设使用 redis@4 客户端 async function getOrSetCache(key) { let value = await redis.get(key); if (!value) { // 替换为调用目标API获取数据的函数 const apiData = await fetchTargetApi(); value = JSON.stringify(apiData); await redis.set(key, value); } return JSON.parse(value); }
针对你需要在API数据变更时更新缓存的需求,以下是几种实用方案:
1. 给缓存设置过期时间(TTL)
适合数据允许短时间不一致的场景,缓存自动过期后会重新从API拉取最新值:
async function getOrSetCacheWithTTL(key, ttlSeconds = 3600) { let value = await redis.get(key); if (!value) { const apiData = await fetchTargetApi(); value = JSON.stringify(apiData); // 设置缓存并指定过期时间 await redis.set(key, value, { EX: ttlSeconds }); } return JSON.parse(value); }
2. 主动触发缓存更新
如果你的系统能感知到API数据变更的时机(比如后台有数据更新操作),直接在变更后调用更新缓存的方法:
// 当API数据变更时调用此函数 async function updateCache(key) { const latestData = await fetchTargetApi(); await redis.set(key, JSON.stringify(latestData)); } // 示例:在数据更新接口中触发缓存更新 app.post('/update-data', async (req, res) => { // 执行数据更新逻辑 await updateDatabase(req.body); // 更新对应缓存 await updateCache('your-target-cache-key'); res.send('数据更新完成'); });
3. 缓存失效标记机制
如果无法直接感知API变更,可以设置一个专门的失效标记key,每次获取缓存前先检查标记是否更新:
const CACHE_KEY = 'your-data-key'; const INVALIDATION_KEY = 'your-data-invalidated'; async function getOrRefreshCache() { // 先检查失效标记 const isInvalidated = await redis.get(INVALIDATION_KEY); let value = await redis.get(CACHE_KEY); if (isInvalidated || !value) { const latestData = await fetchTargetApi(); value = JSON.stringify(latestData); await redis.set(CACHE_KEY, value); // 清除失效标记 await redis.del(INVALIDATION_KEY); } return JSON.parse(value); } // 当需要更新缓存时,只需设置失效标记 async function invalidateCache() { await redis.set(INVALIDATION_KEY, 'true'); }
4. 版本号对比机制
在API返回的数据中加入版本号,每次获取缓存时对比版本号,不一致则更新:
async function getOrUpdateCacheByVersion(key) { const cachedValue = await redis.get(key); let data; if (cachedValue) { data = JSON.parse(cachedValue); // 调用API获取最新版本号 const latestVersion = await fetchApiVersion(); if (data.version !== latestVersion) { // 版本不一致,重新拉取数据 const latestData = await fetchTargetApi(); data = latestData; await redis.set(key, JSON.stringify(data)); } } else { // 缓存不存在,拉取初始数据 data = await fetchTargetApi(); await redis.set(key, JSON.stringify(data)); } return data; }
内容的提问来源于stack exchange,提问作者Kapil Yadav
相关产品推荐
相关产品推荐

