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中的非阻塞方法介绍
Jun 05 NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
NodeJS连接MongoDB数据库时报错的快速解决方法
May 13 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 NodeJs
Nodejs中Express 常用中间件 body-parser 实现解析
May 22 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 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&java(三)
2006/10/09 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
script标签的 charset 属性使用说明
2010/12/04 Javascript
JavaScript Math.ceil() 函数使用介绍
2013/12/11 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
新闻上下滚动jquery 超简洁(必看篇)
2017/01/21 Javascript
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
Python Tkinter简单布局实例教程
2014/09/03 Python
Python实现随机选择元素功能
2017/09/14 Python
python3使用matplotlib绘制条形图
2020/03/25 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
python -v 报错问题的解决方法
2020/09/15 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
视图的作用
2014/12/19 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
体育学院毕业生自荐信
2013/11/03 职场文书
建筑专业毕业生推荐信
2013/11/21 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
2014年法院个人工作总结
2014/12/17 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
物业管理交接协议书
2016/03/24 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
Javascript中async与await的捕捉错误详解
2022/03/03 Javascript