全栈新手求教:如何用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
相关产品推荐
相关产品推荐

