0

0

Redis 多键有序列表批量读取与员工 ID 映射实战(Node.js 教程)

心靈之曲

心靈之曲

发布时间:2026-02-10 11:33:45

|

439人浏览过

|

来源于php中文网

原创

Redis 多键有序列表批量读取与员工 ID 映射实战(Node.js 教程)

本文详解如何在 node.js 中高效、安全地批量读取 redis 中多个以 user:gxxxx 格式命名的有序列表(list),并精准将每条数据绑定其对应的员工 id,避免异步并发导致的连接关闭错误。

在构建高并发调度类应用(如排班系统)时,常需根据员工身份快速拉取其全部排班记录。Redis 的 List 结构天然适合按时间顺序存储日程(如 lpush user:G1257 "{...}"),但若对每个员工发起独立 lRange 请求,不仅会因大量并发回调耗尽连接资源,更易触发 ClientClosedError —— 正如原始代码中 forEach + 回调 方式所遭遇的问题:Node.js 事件循环未等待 Redis 命令完成即提前释放连接,导致后续命令失败。

根本解法是避免并发回调,改用原子化批量执行。Redis 官方推荐方案是 MULTI/EXEC 事务或更轻量的 Pipeline;在 @redis/client(v4+)中,multi() 实例天然支持命令队列与 Promise 化执行,兼具性能与语义清晰性。

以下为生产就绪的实现步骤:

讯飞绘文
讯飞绘文

讯飞绘文:免费AI写作/AI生成文章

下载

✅ 步骤一:使用 multi().exec() 批量提交所有 lRange 请求

const { createClient } = require('redis');
const client = createClient();
await client.connect(); // 确保连接已建立

// 示例路由逻辑(Express)
router.get('/scheduler', async (req, res) => {
  try {
    // 1. 查询目标员工列表(例如按职级筛选)
    const personnelList = await Personnel.findAll({
      where: { mgr_wrkpersonnels_designation: req.query.mgr_wrkpersonnels_designation }
    });

    // 2. 构建 MULTI 批量命令
    const multi = client.multi();
    personnelList.forEach(person => {
      const empId = person.dataValues.mgr_wrkpersonnels_empid;
      multi.lRange(`user:${empId}`, 0, -1); // 不带回调,仅入队
    });

    // 3. 一次性执行所有命令,返回扁平化结果数组
    const results = await multi.exec(); // 类型:Array<[error, reply] | null>

    // 4. 解析结果并注入 empId 上下文
    const allSchedules = results.map((result, idx) => {
      if (!result || result[0]) {
        console.warn(`Failed to fetch list for ${personnelList[idx].dataValues.mgr_wrkpersonnels_empid}:`, result?.[0]);
        return [];
      }

      const empId = personnelList[idx].dataValues.mgr_wrkpersonnels_empid;
      return result[1] // lRange 返回的字符串数组
        .map(str => JSON.parse(str))
        .map(item => ({ ...item, resource: empId })); // 绑定员工标识
    });

    res.json(allSchedules);
  } catch (err) {
    console.error('Scheduler fetch error:', err);
    res.status(500).json({ error: 'Failed to load schedules' });
  }
});

⚠️ 关键注意事项

  • 勿在 forEach 中直接调用异步 Redis 方法:原始错误源于 client.lRange(..., callback) 在未确保连接存活时被多次调用,而 multi() 将所有命令序列化至服务端,彻底规避连接竞争。
  • multi.exec() 返回二维数组:每个元素为 [error, reply] 元组,需显式判空与错误处理(如示例中的 if (!result || result[0]))。
  • JSON 解析需防御性编程:Redis 存储的是字符串,JSON.parse() 可能抛异常,建议包裹 try/catch 或使用 safeParse 工具函数。
  • 连接生命周期管理:确保 client.connect() 在应用启动时调用,并在进程退出前调用 client.quit()(可在 process.on('SIGTERM') 中处理)。

? 性能与扩展提示

  • 单次 multi.exec() 可轻松处理数百个 lRange,实测响应稳定在 ~6ms(见原文日志),远优于串行请求(O(n) 网络往返)或无序并发(O(1) 但风险高)。
  • 若未来需支持分页或条件过滤,可结合 LRANGE 起始索引与 LLEN 预估总量,或改用 Sorted Set(ZSET)按时间戳排序,启用 ZRANGEBYSCORE。
  • 对于超大规模员工(>10k),建议增加 Redis 连接池(如 redis.createCluster())或引入缓存降级策略(如本地 LRU Cache + TTL)。

通过 MULTI/EXEC 批量读取,你不仅解决了 ClientClosedError,更获得了一致、可预测、低延迟的数据加载能力——这是构建实时调度系统的底层基石。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

435

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

543

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

317

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

79

2025.09.10

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

803

2023.08.22

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

161

2025.12.04

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

331

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.10.25

TensorFlow2深度学习模型实战与优化
TensorFlow2深度学习模型实战与优化

本专题面向 AI 与数据科学开发者,系统讲解 TensorFlow 2 框架下深度学习模型的构建、训练、调优与部署。内容包括神经网络基础、卷积神经网络、循环神经网络、优化算法及模型性能提升技巧。通过实战项目演示,帮助开发者掌握从模型设计到上线的完整流程。

0

2026.02.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号