当前位置: 首页 > news >正文

2个nodejs进程利用redis 实现订阅发布

1.新建文件 redis_db.js

'use strict';const redis = require('redis');
const options = {host: "127.0.0.1",port: 6379,password: "123456", // CONFIG SET requirepass "123456"
}var array = []
for(var i=0; i<3; i++){const client = redis.createClient(options)array.push(client)
}function getDB(index){if(typeof index === "number"){return array[index]}return array
}for(var key in array){const client = array[key]client.on('error', err => console.log('------ client Redis connection failed ------' + err)).on('connect', () => console.log('------ client Redis connection succeed ------'))
}module.exports = {getDB,
}

备注1:安装 reids 啥的就不说了

【保姆级】Redis安装教程(Windows版)_windows安装redis-CSDN博客

linux环境安装redis(亲测完成)_linux 斌阿姨安装redis-CSDN博客

备注2:新增3个redis的连接:  [0] 是之前的;  [1] 用于sub; [2] 用于pub

如果没有多个的话,sub和pub的时候会报错 

ReplyError: ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context

2.新建文件 redis_ipc.js

var redis_db = require("./redis_db.js");
const clients  = redis_db.getDB()
const client1  = clients[1]
const client2  = clients[2]function mySub(channelName, handleMessage){// 订阅指定的频道client1.subscribe(channelName, (err, channels) => {if (err) {console.error('无法订阅频道:', err);} else {// 设置每次收到新消息时调用的处理函数client1.on('message', handleMessage);}})
}function myPub(channelName, messageContent){client2.publish(channelName, messageContent, (err, reply) => {if (!err && reply === 0) {console.log(`消息 "${messageContent}" 未被任何人接收。`);} else if (!err && reply > 0) {console.log(`消息 "${messageContent}" 已成功发送给 ${reply} 个订阅者。`);} else {console.error('发送消息失败:', err);}});
}module.exports = {mySub,myPub,
}

3.新增测试代码

3.1新建文件test01.js 测试同个进程的


const redis_ipc = require('./redis_ipc.js')
function testSubPub(){const channelName = 'test_channel_1';function handleMessage(channel, message) {// 在这里编写处理收到消息后的操作console.log(`收到来自 ${channel} 通道的消息:${message}`);}redis_ipc.mySub(channelName, handleMessage)const messageContent = '{"data":{"name":"xxx","age":"18"}}';redis_ipc.myPub(channelName, messageContent)
}testSubPub()

目录如下:

执行指令:node .\test01.js

3.2新建文件test02.js test03.js 测试同个进程的

// test02.js
const redis_ipc = require('./redis_ipc.js')
function testSubPub(){const channelName = 'test_channel_1';function handleMessage(channel, message) {// 在这里编写处理收到消息后的操作console.log(`收到来自 ${channel} 通道的消息:${message}`);}redis_ipc.mySub(channelName, handleMessage)// const messageContent = '{"data":{"name":"xxx","age":"18"}}';// redis_ipc.myPub(channelName, messageContent)
}testSubPub()
test03.js
const redis_ipc = require('./redis_ipc.js')
function testSubPub(){const channelName = 'test_channel_1';// function handleMessage(channel, message) {//     // 在这里编写处理收到消息后的操作//     console.log(`收到来自 ${channel} 通道的消息:${message}`);// }// redis_ipc.mySub(channelName, handleMessage)const messageContent = '{"data":{"name":"xxx","age":"18"}}';redis_ipc.myPub(channelName, messageContent)
}testSubPub()

订阅者:先在一个终端执行 node .\test02.js 

发布者:再在一个终端执行 node .\test03.js

观察第一个终端 会收到 发布者的消息

4.大功告成

http://www.lryc.cn/news/278262.html

相关文章:

  • LeetCode——2397. 被列覆盖的最多行数
  • java通过HttpClient方式实现https请求的工具类(绕过证书验证)
  • 【自学笔记】01Java基础-07面向对象基础-04接口与内部类详解
  • 【cmu15445c++入门】(5)c++中的模板类
  • MongoDB聚合:$bucket
  • 从优化设计到智能制造:生成式AI在可持续性3D打印中的潜力和应用
  • vue3 响应式api中特殊的api
  • 【大厂算法面试冲刺班】day2:合并两个有序链表
  • 【JaveWeb教程】(19) MySQL数据库开发之 MySQL数据库操作-DML 详细代码示例讲解
  • Web前端篇——ElementUI之el-scrollbar + el-backtop + el-timeline实现时间轴触底刷新和一键返回页面顶部
  • CAS-ABA问题编码实战
  • Linux 常用进阶指令
  • windows通过ssh连接Liunx服务器并实现上传下载文件
  • 【K8S 存储卷】K8S的存储卷+PV/PVC
  • 工业智能网关如何保障数据通信安全
  • 基于Springboot的课程答疑系统(有报告)。Javaee项目,springboot项目。
  • 操作系统 内存相关
  • 【模拟IC学习笔记】 PSS和Pnoise仿真
  • IPv6邻居发现协议(NDP)---路由发现
  • OpenPLC v3 代码结构
  • 安全防御之备份恢复技术
  • 条款39:明智而审慎地使用private继承
  • 【数据库原理】(20)查询优化概述
  • FineBI实战项目一(18):每小时上架商品个数分析开发
  • Pytorch常用的函数(六)常见的归一化总结(BatchNorm/LayerNorm/InsNorm/GroupNorm)
  • 业务记录笔记
  • Leetcode16-有多少小于当前数字的数字(1365)
  • JavaWeb- Tomcat
  • Android studio 各本版下载
  • [C#]winform部署PaddleOCRV3推理模型