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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:12:58