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 相关文章推荐
跟我学Nodejs(二)--- Node.js事件模块
May 21 NodeJs
nodejs文件操作模块FS(File System)常用函数简明总结
Jun 05 NodeJs
nodejs开发环境配置与使用
Nov 17 NodeJs
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 NodeJs
NodeJS Web应用监听sock文件实例
Feb 18 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
nodejs创建web服务器之hello world程序
Aug 20 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
基于nodejs实现微信支付功能
Dec 20 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 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教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
php常用字符函数实例小结
2016/12/29 PHP
javascript 限制输入脚本大全
2009/11/03 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
js三种排序算法分享
2012/08/16 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
vue cli 全面解析
2018/02/28 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
2020/04/16 Javascript
简单谈谈python中的Queue与多进程
2016/08/25 Python
Python实现的中国剩余定理算法示例
2017/08/05 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
婚鞋、新娘鞋、礼服鞋、童鞋:Nina Shoes
2019/09/04 全球购物
九年级化学教学反思
2014/01/28 职场文书
总经理工作职责范文
2014/03/14 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
地球一小时宣传标语
2014/06/24 职场文书
生物学专业求职信
2014/07/23 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
街道务虚会发言材料
2014/10/20 职场文书
保密工作整改报告
2014/11/06 职场文书
Python Matplotlib库实现画局部图
2021/11/17 Python