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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:45:49