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学习小结(一)
Jul 06 NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
NodeJs——入门必看攻略
Jun 27 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
Nodejs异步回调之异常处理实例分析
Jun 22 NodeJs
NodeJS加密解密及node-rsa加密解密用法详解
Oct 12 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 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数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
sae使用smarty模板的方法
2013/12/17 PHP
php随机显示图片的简单示例
2014/02/15 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
js中function()使用方法
2013/12/24 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
python元组操作实例解析
2014/09/23 Python
Python isinstance函数介绍
2015/04/14 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
Python 脚本拉取 Docker 镜像问题
2019/11/10 Python
Python函数式编程指南:对生成器全面讲解
2019/11/19 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
python正则表达式 匹配反斜杠的操作方法
2020/08/07 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
外贸业务员求职自荐信分享
2013/09/21 职场文书
升国旗仪式主持词
2014/03/19 职场文书
授权委托书格式模板
2014/04/03 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL