最近项目使用redis,对publish 和 subscribe的使用进行了了解,并进行了封装。

 var config = require('../config/config');
var log = require("./loghelp");
var redis = require("redis");
function initialclient(param) {
var option={ host: config.redis.host, port: config.redis.port};
if(param)
{
option=Object.assign(option,param);
}
redis.print
let client = redis.createClient(option);
client.on("error", function(err) {
log.error(err);
});
return client;
}
 /*example:
* let channel="ryan";
redis.pubSub.registerHandlers("ryan",msg=> console.log(msg));
redis.pubSub.subscribe(channel); redis.pubSub.publish(channel,"hello from chen");*/
class PubSub
{
constructor(){
this.sub=initialclient();
this.handlers=new Map();
this.subAction=(channle,message)=>{
let actions= this.handlers.get(channle)||new Set();
for(let action of actions)
{
action(message);
}
}
this.alredyPublishs=[];
this.subConnected=false;
} publish(channel,message)
{
let action=()=>{
let pub=initialclient();
pub.publish(channel,message);
};
if(this.subConnected===false)
{
this.alredyPublishs.push(action);
}
else
action();
}
registerHandlers(channel,action)
{
var actions=this.handlers.get(channel)||new Set();
actions.add(action);
this.handlers.set(channel,actions);
}
subscribe(channel)
{
let self=this;
this.sub.subscribe(channel,function (err,reply) {
if(err)
log.error(err);
self.subConnected=true;
for(let publish of self.alredyPublishs)
publish();
console.log(reply);
}); this.sub.on("message", function (channel, message) {
self.subAction(channel,message);
});
} tearDown()
{
this.sub.quit();
}
}

然后通过exports.pubsub=new PubSub() 将其暴漏,可保证是单例。在程序启动时,调用

registerHandlers  注册特定通道的处理逻辑,然后调用
subscribe  订阅通道。

在合适时机调用publish,这个机制可以实现分布式下所有客户端watch 同一个数据的更改。

nodejs redis 发布订阅机制封装的更多相关文章

  1. Redis发布订阅机制

    1. 什么是Redis Redis是一个开源的内存数据库,它以键值对的形式存储数据.由于数据存储在内存中,因此Redis的速度很快,但是每次重启Redis服务时,其中的数据也会丢失,因此,Redis也 ...

  2. Redis 发布/订阅机制原理分析

    Redis 通过 PUBLISH. SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能.   这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播.实时 ...

  3. 六. Redis发布订阅机制

    发布订阅(pub/sub)是一种消息通信模式,主要是解除消息发布者和消息订阅者之间通信的耦合. Redis作为一个pub/sub的服务器,在订阅者和发布者之间起到了一个消息路由的功能.订阅者可以通过s ...

  4. Redis 发布订阅,小功能大用处,真没那么废材!

    今天小黑哥来跟大家介绍一下 Redis 发布/订阅功能. 也许有的小伙伴对这个功能比较陌生,不太清楚这个功能是干什么的,没关系小黑哥先来举个例子. 假设我们有这么一个业务场景,在网站下单支付以后,需要 ...

  5. 【spring boot】【redis】spring boot 集成redis的发布订阅机制

    一.简单介绍 1.redis的发布订阅功能,很简单. 消息发布者和消息订阅者互相不认得,也不关心对方有谁. 消息发布者,将消息发送给频道(channel). 然后是由 频道(channel)将消息发送 ...

  6. RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用

    本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址.http://www.cnblogs.com/tdws/tag/NoSql/ Redis Pub/Sub模式 基本介绍 Re ...

  7. Linux(6)- redis发布订阅/持久化/主从复制/redis-sentinel/redis-cluster、nginx入门

    一.redis发布订阅 Redis 通过 PUBLISH .SUBSCRIBE 等命令实现了订阅与发布模式. 其实从Pub/Sub的机制来看,它更像是一个广播系统,多个Subscriber可以订阅多个 ...

  8. redis发布订阅Java代码实现

    Redis除了可以用作缓存数据外,另一个重要用途是它实现了发布订阅(pub/sub)消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 为了实现redis的发布订阅机制,首先要打开re ...

  9. python中使用redis发布订阅者模型

    redis发布订阅者模型: Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel.发布者和订阅者都是Redis客户端,Channel则 ...

随机推荐

  1. JavaFx导出文件

    导出文件格式可选 protected void handExportDateAction(ActionEvent event) { // ShowDialog.showConfirmDialog(FX ...

  2. 常用正则表达式整理[JavaScript]

    URL /^(http\:\/\/|https\:\/\/)(.{4,})$/ 18位身份证号 //前17位数字,末位支持X/^\d{17}\d{1}$|^\d{17}x{1}$/ 手机号 //11位 ...

  3. 在CentOS 7 中 安装 VSFTP

    在线安装:yum install -y vsftpd 使用yum 进行卸载:yum -y remove vsftpd 编辑配置:vi /etc/vsftpd/vsftpd.conf 查看FTP进程是否 ...

  4. java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.

    分析:android 4.2.X及以下的版本,addHeaderView必须在setAdapter之前,否则会抛出IllegalStateException. android 4.2.X(API 17 ...

  5. 第18讲——ActiveX控件

    1,容器应用程序是可以嵌入或链接对象的应用程序.服务器应用程序是创建对象并且当对象被双击时,可以被启动的应用程序. 2,可以安装一个TstCon32来测试ActiveX控件 3,可以用 Invalid ...

  6. 无线连接Android设备

    有时设备处于低电,此时又需要进行设备与PC的数据传输,但是通过USB连接充电速度太慢.这时就可以通过无线进行传输数据,然后通过AC充电.一举两得. 前提: 1.在Android设备的开发者模式-打开U ...

  7. STM32学习及应用笔记一:SysTick定时器学习及应用

    这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick究竟是 ...

  8. Android笔记:蓝牙

    if (!BTAdapter.isEnabled()) { //没有打开,就启动确认窗口询问用户是否打开 Intent i = new Intent(BluetoothAdapter.ACTION_R ...

  9. mysql常用函数

    一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. 注:对大小写不敏感 ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大 ...

  10. 解决java.lang.NoClassDefFoundError: org/objectweb/asm/util/TraceClassVisitor

    方案一: <dependency> <groupId>asm</groupId> <artifactId>asm-all</artifactId& ...