nodejs redis 发布订阅机制封装实现方法及实例代码


Posted in NodeJs onDecember 15, 2016

 nodejs redis 发布订阅机制封装

最近项目使用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 同一个数据的更改。

本人全手工打造的dotnetcore webapi 框架,可实现快速开发。

地址:http://xiazai.3water.com/201612/yuanma/WebApiCore-master(3water.com).rar。

1 采用DDD模式开发,充血模型 2 添加Dapper扩展,默认实现增删改查基本操作。利用AutoMapper 做实体转换,减少重复劳动。 3 依赖注入融合Autofac,仓储层和应用层自动注入 4 实现JWT验证 5 加入swagger 文档 6 单元测试添加了xunit,MyMvc 可以方便对webapi测试 7 数据库版本控制

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

NodeJs 相关文章推荐
Windows系统中安装nodejs图文教程
Feb 28 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
nodeJs内存泄漏问题详解
Sep 05 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
浅析 NodeJs 的几种文件路径
Jun 07 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
nodeJS模块简单用法示例
Apr 21 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
如何利用nodejs自动定时发送邮件提醒(超实用)
Dec 01 NodeJs
解析NodeJs的调试方法
Dec 11 #NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 #NodeJs
Nodejs 搭建简单的Web服务器详解及实例
Nov 30 #NodeJs
Nodejs下用submit提交表单提示cannot post错误的解决方法
Nov 21 #NodeJs
Nodejs进阶:核心模块net入门学习与实例讲解
Nov 21 #NodeJs
Nodejs进阶:基于express+multer的文件上传实例
Nov 21 #NodeJs
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
Nov 21 #NodeJs
You might like
PHP汉字转换拼音的函数代码
2015/12/30 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
代码详解JS操作剪贴板
2018/02/11 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
Python with用法实例
2015/04/14 Python
python正则表达式的使用
2017/06/12 Python
Python入门之后再看点什么好?
2018/03/05 Python
Python装饰器用法实例总结
2018/05/26 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
广告学专业毕业生自荐信
2014/05/28 职场文书
幼儿园大班开学寄语
2014/08/02 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
求职简历自我评价2015
2015/03/10 职场文书
2015年检验科工作总结
2015/04/27 职场文书