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

Node.js中如何将JSON响应存储至内存?

嘿,这个需求在Node.js开发里太常见了!我给你整理几种实用的内存缓存实现方式,你可以根据自己的场景挑:

基础场景:用模块级变量直接缓存

如果只是缓存单一接口的数据,最简单的方式就是用模块级变量(Node.js里模块是单例的,这个变量会一直驻留在内存里,直到进程结束)。还可以加上过期判断,避免一直用旧数据:

// 模块内声明缓存变量,整个应用生命周期都能访问
let cachedApiData = null;
let lastFetchTimestamp = null;

// 用node-fetch调用接口,你也可以替换成axios、got等工具
const fetch = require('node-fetch');

async function getCachedApiData() {
  // 缓存存在且未过期(这里设为5分钟有效期),直接返回缓存
  const isCacheValid = cachedApiData && lastFetchTimestamp 
    && Date.now() - lastFetchTimestamp < 5 * 60 * 1000;
  
  if (isCacheValid) {
    console.log('✅ 返回内存缓存的数据');
    return cachedApiData;
  }

  // 缓存失效,重新调用接口并更新缓存
  const response = await fetch('https://your-target-api.com/data');
  cachedApiData = await response.json();
  lastFetchTimestamp = Date.now();
  
  console.log('🔄 获取新数据并更新内存缓存');
  return cachedApiData;
}

// 调用示例
getCachedApiData().then(data => console.log('数据内容:', data));
多场景缓存:用Map/Object做键值对存储

如果需要缓存多个接口的数据,或者按不同业务标识区分缓存,用Map(或者普通Object)会更灵活,能轻松管理多组缓存:

const fetch = require('node-fetch');

// 用Map存储缓存,支持任意类型的键,比普通Object更灵活
const cacheStore = new Map();

/**
 * 获取并缓存接口数据
 * @param {string} apiUrl - 目标接口地址
 * @param {string|symbol} cacheKey - 缓存标识键
 * @param {number} ttl - 缓存有效期(毫秒,默认5分钟)
 */
async function fetchAndCache(apiUrl, cacheKey, ttl = 5 * 60 * 1000) {
  const cachedEntry = cacheStore.get(cacheKey);
  
  // 检查缓存是否有效
  if (cachedEntry && Date.now() - cachedEntry.timestamp < ttl) {
    return cachedEntry.data;
  }

  // 请求新数据并更新缓存
  const response = await fetch(apiUrl);
  const data = await response.json();
  cacheStore.set(cacheKey, { data, timestamp: Date.now() });
  
  return data;
}

// 调用示例:缓存不同接口的数据
fetchAndCache('https://api.example.com/users', 'user-list')
  .then(users => console.log('用户列表:', users));

fetchAndCache('https://api.example.com/posts', 'article-list', 10 * 60 * 1000)
  .then(posts => console.log('文章列表:', posts));
进阶优化:手动/定时清理过期缓存

如果你的应用长时间运行,或者缓存的数据量较大,记得定期清理过期缓存,避免内存占用过高:

// 清理过期缓存的工具函数
function cleanExpiredCache(ttl = 5 * 60 * 1000) {
  const now = Date.now();
  for (const [key, entry] of cacheStore.entries()) {
    if (now - entry.timestamp > ttl) {
      cacheStore.delete(key);
      console.log(`🗑️  清理过期缓存:${key}`);
    }
  }
}

// 每小时自动执行一次缓存清理
setInterval(cleanExpiredCache, 60 * 60 * 1000);

// 也可以在需要的时候手动调用
// cleanExpiredCache();
注意事项
  • Node.js的模块级变量是单进程私有的,如果你的应用用了cluster模块做多进程部署,每个进程的内存缓存是独立的,不会共享。这种场景下如果需要跨进程共享缓存,就得用Redis这类分布式缓存了,但如果只是单进程,内存缓存完全够用。
  • 如果是Express/Koa这类Web框架,也可以把缓存挂载到app.locals对象上,方便在路由 handler 里直接访问,比如app.locals.cachedUsers = data。

内容的提问来源于stack exchange,提问作者N Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:25:51