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关于gzip/deflate压缩详解
Mar 04 NodeJs
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
用nodejs的实现原理和搭建服务器(动态)
Aug 10 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
基于nodejs 的多页面爬虫实例代码
May 31 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
php中CI操作多个数据库的代码
2012/07/05 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
jquery radio 操作代码
2011/03/16 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
jQuery表单设置值的方法
2017/06/30 jQuery
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
利用python程序帮大家清理windows垃圾
2017/01/15 Python
python机器学习实战之树回归详解
2017/12/20 Python
Python决策树分类算法学习
2017/12/22 Python
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
2018/04/28 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
Python实现简单猜数字游戏
2021/02/03 Python
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
工程项目建议书范文
2014/03/12 职场文书
高三毕业寄语
2014/04/10 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
《植物妈妈有办法》教学反思
2016/02/23 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
Python标准库pathlib操作目录和文件
2021/11/20 Python
MySQL常见优化方案汇总
2022/01/18 MySQL
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python