基于Redis-EJS-Express的实时库存MVC应用模型层异步数据问题
解决方案
1. 用Promise.all()并行执行多个Redis查询
Redis的异步方法返回Promise,你可以通过Promise.all()将多个查询任务并行提交,等所有任务完成后统一处理结果,就能同时获取多组所需数据。
示例代码
假设模型层已定义以下异步函数:
// 模型层 redisModel.js const redis = require('redis'); // 配置Docker Redis连接 const client = redis.createClient({ host: 'localhost', port: 6379 }); client.connect(); // 获取所有门店名称(假设存储在Redis集合中) async function getStoreNames() { return client.SMEMBERS('stores:names'); } // 根据门店名称批量获取指定商品库存 async function getProductAmounts(storeNames) { // 构造Redis键数组,格式示例:store:门店名:product:商品名 const keys = storeNames.map(name => `store:${name}:product:apple`); // 用MGET批量查询,减少网络请求次数 const rawAmounts = await client.MGET(keys); // 将字符串结果转为数字,处理空值 return rawAmounts.map(amount => parseInt(amount) || 0); }
在控制器store.js中,结合async/await实现并行查询:
// 控制器 store.js const redisModel = require('../models/redisModel'); async function renderStoresPage(req, res) { try { // 第一步:获取门店名称列表 const storesName = await redisModel.getStoreNames(); // 第二步:基于门店名称批量获取库存数据 const productsAmount = await redisModel.getProductAmounts(storesName); // 渲染页面并传递数据 res.render("pages/stores", { storesName, productsAmount }); // 若有多个独立查询(无需依赖关系),可直接用Promise.all并行执行: // const [storesName, globalStockStat] = await Promise.all([ // redisModel.getStoreNames(), // redisModel.getGlobalStockStat() // ]); } catch (err) { console.error('Redis查询失败:', err); res.status(500).send('服务器内部错误'); } } module.exports = { renderStoresPage };
2. 利用Redis批量命令优化性能
优先使用Redis的批量操作命令(如MGET、HMGET、SMEMBERS)替代循环执行单个查询,既能减少网络交互次数,也能降低异步操作的复杂度。
3. 错误处理要点
- 用
try/catch包裹所有异步操作,捕获Redis连接或查询异常,避免未处理的Promise崩溃服务器。 - 根据错误类型返回对应响应(如Redis连接失败返回503,数据不存在返回404)。
内容的提问来源于stack exchange,提问作者dfdf1
相关产品推荐
相关产品推荐

