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

全栈新手求教:如何用Redis在Node.js中每10分钟缓存MySQL查询结果

实现station_status接口的Redis缓存优化

核心逻辑

优先从Redis读取缓存数据,缓存不存在或过期时,从MySQL查询最新数据并写入Redis,同时设置10分钟(600秒)的过期时间。另外添加定时任务,每10分钟主动刷新缓存,确保缓存始终和数据库同步(匹配你的Python服务更新频率)。

修改后的完整代码

const express = require('express');
const db = require('./config/db')
const cors = require('cors')
const redis = require('redis');
const client = redis.createClient();

const app = express();
const PORT = 8800;
const CACHE_EXPIRE = 600; // 10分钟,单位秒
const CACHE_KEY = 'station_status_cache'; // 缓存键名

app.use(cors());
app.use(express.json())

// 处理Redis连接状态
client.on('error', err => console.log('Redis Client Error', err));
client.on('connect', () => console.log('Connected to Redis'));
client.connect(); // 初始化Redis连接

// 封装:从MySQL获取数据并写入Redis缓存
async function updateStationStatusCache() {
    return new Promise((resolve, reject) => {
        db.query(
            "SELECT station_id, available_docks, available_electronic_bikes,available_mechanical_bikes, available_bikes, status, MAX(last_update) as last_update,district_name FROM station_status GROUP BY station_id",
            (err, result) => {
                if (err) {
                    console.log('MySQL查询失败:', err);
                    reject(err);
                    return;
                }
                // 将数据存入Redis并设置过期时间
                client.setEx(CACHE_KEY, CACHE_EXPIRE, JSON.stringify(result));
                console.log('Station status缓存已更新');
                resolve(result);
            }
        );
    });
}

// station_status接口:优先读取缓存
app.get("/station_status", async (req, res) => {
    try {
        // 尝试从Redis读取缓存
        const cachedData = await client.get(CACHE_KEY);
        if (cachedData) {
            // 缓存存在,直接返回解析后的数据
            res.send(JSON.parse(cachedData));
            return;
        }
        // 缓存不存在,从MySQL拉取数据并写入缓存
        const freshData = await updateStationStatusCache();
        res.send(freshData);
    } catch (err) {
        console.log('接口请求失败:', err);
        res.status(500).send('服务器内部错误');
    }
})

app.get("/station_information", (req, res) => {
    db.query("SELECT station_id, name, lat, lon, capacity FROM station_information", (err, result) => {
        if (err) {
            console.log(err)
        } else {
            res.send(result)
        }
    })
})

app.listen(PORT, async () => {
    console.log('Connected to server')
    console.log(`Server is running on ${PORT}`);
    // 服务启动时先初始化一次缓存
    await updateStationStatusCache();
    // 每10分钟自动刷新缓存
    setInterval(updateStationStatusCache, CACHE_EXPIRE * 1000);
});

关键说明

  • Redis连接修复:补充了client.connect()和连接状态监听,确保Redis客户端正常建立连接。
  • 缓存逻辑复用:把数据库查询和缓存写入封装成异步函数,方便在接口请求和定时任务中复用。
  • 接口流程优化:用async/await处理Redis异步操作,优先返回缓存数据,减少数据库查询次数。
  • 定时同步机制:服务启动时初始化缓存,之后每10分钟自动刷新,和你的Python数据更新频率对齐,保证缓存数据时效性。
  • 错误兜底处理:添加异常捕获,避免单个请求失败导致服务崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:33:26