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实现的一个简单udp广播服务器、客户端
Sep 25 NodeJs
轻松创建nodejs服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 NodeJs
Nodejs中 npm常用命令详解
Jul 04 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
nodejs中实现用户注册路由功能
May 20 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 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
2006/12/14 PHP
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
php去除字符串换行符示例分享
2014/02/13 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
微信公众号 客服接口的开发实例详解
2016/09/28 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
Python完成毫秒级抢淘宝大单功能
2019/06/06 Python
简单了解Python3里的一些新特性
2019/07/13 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
自荐信写法介绍
2014/01/25 职场文书
师德个人剖析材料
2014/02/02 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
农业项目投资意向书
2015/05/09 职场文书
2015年统战工作总结
2015/05/19 职场文书
感恩的心主题班会
2015/08/12 职场文书
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis