Node.js中如何维护全局HashMap并实现每日自动刷新?
解决方案
1. 利用Node.js模块单例特性实现全局缓存
Node.js模块加载是单例模式,直接把缓存封装在独立模块里,就能保证整个应用只存在一个缓存实例,避免重复初始化。
创建dataCache.js模块:
const HashMap = require('hashmap'); const { Pool } = require('pg'); // 初始化Postgres连接池 const pool = new Pool({ user: '你的用户名', host: '数据库地址', database: '数据库名', password: '数据库密码', port: 5432, }); // 全局缓存实例 let dataCache = new HashMap(); // 从Postgres加载数据到缓存的函数 async function loadDataToCache() { const client = await pool.connect(); try { const result = await client.query('SELECT key_column, value_column FROM 你的表名'); // 先清空旧缓存再填充新数据 dataCache.clear(); result.rows.forEach(row => { dataCache.set(row.key_column, row.value_column); }); console.log('缓存已更新'); } catch (err) { console.error('缓存加载失败:', err); } finally { client.release(); } } // 暴露查询缓存的方法 function getFromCache(key) { return dataCache.get(key); } module.exports = { init: loadDataToCache, get: getFromCache, };
2. 项目启动时初始化缓存
在入口文件index.js里,启动服务前先完成缓存初始化:
const express = require('express'); const dataCache = require('./dataCache'); const app = express(); // 先加载缓存再启动服务 (async () => { await dataCache.init(); app.listen(3000, () => { console.log('服务已启动'); }); })(); // 业务接口直接复用缓存 app.get('/get-value/:key', (req, res) => { const value = dataCache.get(req.params.key); res.json({ key: req.params.key, value }); });
3. 每日定时更新缓存
用node-schedule实现每日定时刷新(比原生setInterval更灵活):
先安装依赖:
npm install node-schedule
修改dataCache.js,添加定时任务:
const schedule = require('node-schedule'); // ... 保留之前的代码 ... // 每日凌晨2点执行缓存更新 schedule.scheduleJob('0 0 2 * * *', async () => { await loadDataToCache(); }); // ... 导出部分不变 ...
4. 优化细节
- 并发安全:如果担心更新时缓存为空,可先把新数据加载到临时缓存,再原子替换全局实例:
async function loadDataToCache() { const client = await pool.connect(); try { const result = await client.query('SELECT key_column, value_column FROM 你的表名'); const newCache = new HashMap(); result.rows.forEach(row => { newCache.set(row.key_column, row.value_column); }); // 原子替换旧缓存,避免查询到空数据 dataCache = newCache; console.log('缓存已更新'); } catch (err) { console.error('缓存更新失败:', err); } finally { client.release(); } } - 减少依赖:其实Node.js原生
Map已经能满足需求,不需要额外的hashmap包,替换后代码逻辑完全一致,还能减少项目依赖。
内容的提问来源于stack exchange,提问作者User_16647160
相关产品推荐
相关产品推荐

