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
相关产品推荐
相关产品推荐

