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教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
基于NodeJS的前后端分离的思考与实践(五)多终端适配
Sep 26 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
nodejs更改项目端口号的方法
May 13 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
nodejs中实现修改用户路由功能
May 24 NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 20 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 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程序?
2006/12/08 PHP
php mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
Yii2.0中的COOKIE和SESSION用法
2016/08/12 PHP
理解Javascript_10_对象模型
2010/10/16 Javascript
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
2014/11/26 Javascript
jQuery过滤选择器详解
2015/01/13 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
2015/11/01 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
anaconda如何查看并管理python环境
2019/07/05 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
Python八皇后问题解答过程详解
2019/07/29 Python
python json.dumps中文乱码问题解决
2020/04/01 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
Html5之webcoekt播放JPEG图片流
2020/09/22 HTML / CSS
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
幼儿园教师的考核评语
2014/04/18 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书
七一慰问简报
2015/07/20 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
PHP实现两种排课方式
2021/06/26 PHP
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android
详解Python中__new__方法的作用
2022/03/31 Python