最近项目使用redis,对publish 和 subscribe的使用进行了了解,并进行了封装。

  1. var config = require('../config/config');
  2. var log = require("./loghelp");
  3. var redis = require("redis");
  4. function initialclient(param) {
  5. var option={ host: config.redis.host, port: config.redis.port};
  6. if(param)
  7. {
  8. option=Object.assign(option,param);
  9. }
  10. redis.print
  11. let client = redis.createClient(option);
  12. client.on("error", function(err) {
  13. log.error(err);
  14. });
  15. return client;
  16. }
  1. /*example:
  2. * let channel="ryan";
  3. redis.pubSub.registerHandlers("ryan",msg=> console.log(msg));
  4. redis.pubSub.subscribe(channel);
  5.  
  6. redis.pubSub.publish(channel,"hello from chen");*/
  7. class PubSub
  8. {
  9. constructor(){
  10. this.sub=initialclient();
  11. this.handlers=new Map();
  12. this.subAction=(channle,message)=>{
  13. let actions= this.handlers.get(channle)||new Set();
  14. for(let action of actions)
  15. {
  16. action(message);
  17. }
  18. }
  19. this.alredyPublishs=[];
  20. this.subConnected=false;
  21. }
  22.  
  23. publish(channel,message)
  24. {
  25. let action=()=>{
  26. let pub=initialclient();
  27. pub.publish(channel,message);
  28. };
  29. if(this.subConnected===false)
  30. {
  31. this.alredyPublishs.push(action);
  32. }
  33. else
  34. action();
  35. }
  36. registerHandlers(channel,action)
  37. {
  38. var actions=this.handlers.get(channel)||new Set();
  39. actions.add(action);
  40. this.handlers.set(channel,actions);
  41. }
  42. subscribe(channel)
  43. {
  44. let self=this;
  45. this.sub.subscribe(channel,function (err,reply) {
  46. if(err)
  47. log.error(err);
  48. self.subConnected=true;
  49. for(let publish of self.alredyPublishs)
  50. publish();
  51. console.log(reply);
  52. });
  53.  
  54. this.sub.on("message", function (channel, message) {
  55. self.subAction(channel,message);
  56. });
  57. }
  58.  
  59. tearDown()
  60. {
  61. this.sub.quit();
  62. }
  63. }

然后通过exports.pubsub=new PubSub() 将其暴漏,可保证是单例。在程序启动时,调用

  1. registerHandlers 注册特定通道的处理逻辑,然后调用
  1. subscribe 订阅通道。
  2.  
  3. 在合适时机调用publish,这个机制可以实现分布式下所有客户端watch 同一个数据的更改。

nodejs redis 发布订阅机制封装的更多相关文章

  1. Redis发布订阅机制

    1. 什么是Redis Redis是一个开源的内存数据库,它以键值对的形式存储数据.由于数据存储在内存中,因此Redis的速度很快,但是每次重启Redis服务时,其中的数据也会丢失,因此,Redis也 ...

  2. Redis 发布/订阅机制原理分析

    Redis 通过 PUBLISH. SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能.   这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播.实时 ...

  3. 六. Redis发布订阅机制

    发布订阅(pub/sub)是一种消息通信模式,主要是解除消息发布者和消息订阅者之间通信的耦合. Redis作为一个pub/sub的服务器,在订阅者和发布者之间起到了一个消息路由的功能.订阅者可以通过s ...

  4. Redis 发布订阅,小功能大用处,真没那么废材!

    今天小黑哥来跟大家介绍一下 Redis 发布/订阅功能. 也许有的小伙伴对这个功能比较陌生,不太清楚这个功能是干什么的,没关系小黑哥先来举个例子. 假设我们有这么一个业务场景,在网站下单支付以后,需要 ...

  5. 【spring boot】【redis】spring boot 集成redis的发布订阅机制

    一.简单介绍 1.redis的发布订阅功能,很简单. 消息发布者和消息订阅者互相不认得,也不关心对方有谁. 消息发布者,将消息发送给频道(channel). 然后是由 频道(channel)将消息发送 ...

  6. RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用

    本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址.http://www.cnblogs.com/tdws/tag/NoSql/ Redis Pub/Sub模式 基本介绍 Re ...

  7. Linux(6)- redis发布订阅/持久化/主从复制/redis-sentinel/redis-cluster、nginx入门

    一.redis发布订阅 Redis 通过 PUBLISH .SUBSCRIBE 等命令实现了订阅与发布模式. 其实从Pub/Sub的机制来看,它更像是一个广播系统,多个Subscriber可以订阅多个 ...

  8. redis发布订阅Java代码实现

    Redis除了可以用作缓存数据外,另一个重要用途是它实现了发布订阅(pub/sub)消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 为了实现redis的发布订阅机制,首先要打开re ...

  9. python中使用redis发布订阅者模型

    redis发布订阅者模型: Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel.发布者和订阅者都是Redis客户端,Channel则 ...

随机推荐

  1. Linux kernel4.4.12 添加make menuconfig 可选项

    Linux kernel 源码添加可选项 闲来无事,顺便记录一篇在Linux kernel make menuconfig 内添加一个可选项. 说不定将来就要用到这个东西呢. linux kernel ...

  2. 关于angularjs指令

    一个指令用来引入新的HTML语法.指令是DOM元素上的标记,使元素拥有特定的行为.举例来说,静态的HTML不知道如何来创建和展现一个日期选择器控件.让HTML能识别这个语法,我们需要使用指令.指令通过 ...

  3. canvas画圆(一)

    仿第一次效果

  4. Linux 搭建Java web服务器

    未经允许,不得转载 1.jdk的下载与配置 1.1下载 sudo wget http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45- ...

  5. python升级

    一开始有这个需求,是因为用 YaH3C 替代 iNode 进行校园网认证时,一直编译错误,提示找不到 Python 的某个模块,百度了一下,此模块是在 Python2.7 以上才有的,但是系统的自带的 ...

  6. Java职业生涯规划

    java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈 ...

  7. Mahout之数据承载

    转载自:https://www.douban.com/note/204399134/ 推荐数据的处理是大规模的,在集群环境下一次要处理的数据可能是数GB,所以Mahout针对推荐数据进行了优化. Pr ...

  8. 搭建自己的LAMP

    LAMP的搭建说简单也简单,说难也不容易,如果采用一键安装也是比较容易的,但想配置自己需要的版本等等也是比较麻烦.前段时间我分别在自己的电脑和阿里云上部署了Lamp环境,以下是步骤和常出现的问题的解决 ...

  9. Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备二)

    接下来,我们继续分析UIlib.h文件中余下的文件,当然部分文件可能顺序错开分析,这样便于从简单到复杂的整个过程的里面,而避免一开始就出现各种不理解的地方. 1. UIManager.h:UI管理器, ...

  10. 【DWR系列03】- DWR主要类详解

    img { border: 1px solid black } 一.简介 首先应该了解这个jar包主要的类,了解了类,就了解了DWR.DWR的在线javadoc:http://directwebrem ...