You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:19:20