2个nodejs进程利用redis 实现订阅发布
2024-01-08 15:51:34
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.大功告成
文章来源:https://blog.csdn.net/myy2012/article/details/135403430
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!