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 模块开发及发布详解分享
Mar 07 NodeJs
跟我学Nodejs(三)--- Node.js模块
May 25 NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
nodejs中实现用户注册路由功能
May 20 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 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 FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
javascript 面向对象 function类
2010/05/13 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
2014/08/13 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
详解微信小程序开发之formId使用(模板消息)
2019/08/27 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
Python标准库os.path包、glob包使用实例
2014/11/25 Python
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
Python 解析简单的XML数据
2020/07/24 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
英格兰足协官方商店:England Store
2019/07/12 全球购物
教师自荐书
2013/10/08 职场文书
仓库门卫岗位职责
2013/12/22 职场文书
办理生育手续介绍信
2014/01/14 职场文书
物业管理毕业生的自我评价
2014/02/17 职场文书
少年雷锋观后感
2015/06/10 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书