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使用mysql模块之获得更新和删除影响的行数的方法
Mar 18 NodeJs
Nodejs中自定义事件实例
Jun 20 NodeJs
nodejs批量修改文件编码格式
Jan 22 NodeJs
nodejs实现获取某宝商品分类
May 28 NodeJs
Nodejs实战心得之eventproxy模块控制并发
Oct 27 NodeJs
NodeJS学习笔记之Module的简介
Mar 24 NodeJs
CentOS 安装NodeJS V8.0.0的方法
Jun 15 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
Nodejs处理异常操作示例
Dec 25 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 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
DOM XPATH获取img src值的query
2013/09/23 PHP
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
php+mysql查询优化简单实例
2015/01/13 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
DOM相关内容速查手册
2007/02/07 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
Vue实现数据请求拦截
2019/10/23 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
python实现多线程采集的2个代码例子
2014/07/07 Python
python和bash统计CPU利用率的方法
2015/07/10 Python
Python的Twisted框架中使用Deferred对象来管理回调函数
2016/05/25 Python
python版本的仿windows计划任务工具
2018/04/30 Python
对python中的pop函数和append函数详解
2018/05/04 Python
python3.7.0的安装步骤
2018/08/27 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
python web框架中实现原生分页
2019/09/08 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
关于随地扔垃圾的检讨书
2014/09/30 职场文书
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫