nodejs redis的发布与订阅

  redis的发布(pub)是把消息推送到不同的频道或指定的频道,订阅(sub)是订阅一个或多个频道接收来自频道的消息,取消订阅(unsubscribe)。

概念性的就不多做介绍,看源码:

/*
* redis发布订阅
 */
"use strict";

let configFile = require(‘../../include/commons‘).CONFIG_FILE;
let config = require(‘../../resources/config/‘ + configFile);

let RedisModel = require(‘./../redis.model‘);
let RedisSubClient = require(‘./redisSubClient‘);
let RedisPubClient = require(‘./redisPubClient‘);
let redisPubConn = RedisPubClient.redisClient().connection;
let redisSubConn = RedisSubClient.redisClient().connection;

class PubSub{
    constructor(){
        this.sub=redisSubConn;
        this.handlers=new Map();
        this.subAction=(channle,message)=>{
            console.log("接收消息:"+message);
       message = JSON.parse(message);
       //消息处理。。。
      }
        this.alredyPublishs=[];
        this.subConnected=false;
    }

    publish(channel,message)
    {
        let action=()=>{
            let pub=redisPubConn;
            pub.publish(channel,message);
            console.log("发布消息:channel:"+channel+",message:"+message);
        };
        if(this.subConnected===false)
        {
            this.alredyPublishs.push(action);
        }
        else{
            action();
        }
    }

    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);
        });
    }
}
// Expose class
module.exports = new PubSub();

  注意事项:

  1、只要客户端订阅了频道, 发布订阅的指令其他均不能操作,否则会报错。我在实现时发现用了订阅的客户端也不能用来发布消息,会报错。

  2、客户端可简单定义一个方法 var redisClient = redis.createClient(6379,"ip");

参考博客:http://www.cnblogs.com/ryansecreat/p/6121834.html
时间: 2024-10-29 19:18:43

nodejs redis的发布与订阅的相关文章

redis的发布和订阅

发布   PUBLISH 订阅   SUBSCRIBE 发布和订阅的实验 PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE channel [channel ...] 订阅频道,可以同时订阅多个频道 UNSUBSCRIBE [channel ...] 取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道 PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道,每个模式以 * 作为

redis的发布与订阅机制

Redis 通过 PUBLISH. SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能. 这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播.实时提醒等. 本文通过分析 Redis 源码里的 pubsub.c 文件,了解发布和订阅机制的底层实现,籍此加深对 Redis 的理解. 订阅.发布和退订 在开始研究源码之前,不妨先来回顾一下几个相关命令的使用方式. PUBLISH 命令用于向给定的频道发送信息,返回值为接收到信息的订阅者数量: redis

redis 实战教程、redis缓存教程、redis消息发布、订阅、redis消息队列教程

一:本教程使用环境: ubuntu12.x .jdk1.7 .Intellij idea.spring3.2.8 .redis服务端3.0,jedis客户端2.7.3 spring-data-redis 1.6.0 二:redis 服务端安装教程 这里不详解 三:redis 缓存特性 示例如下: spring配置: <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">

python:用Redis完成发布和订阅数据

安装: pip install redis 发布文件: # coding:utf-8 import redis import json class RedisHelper(): def __init__(self): localhost = '192.168.2.x' self.__conn = redis.Redis(host='localhost', port=6379, password='password') # , decode_responses=True, password='pa

redis的发布和订阅操作

原文地址:https://www.cnblogs.com/wuheng-123/p/9762634.html

Redis学习-发布/订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.Redis 客户端可以订阅任意数量的频道. 常用命令 命令 描述 复杂度 返回 PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道.每个模式以*作为匹配符,比如it*匹配所有以 it 开头的频道( it.news . it.blog . it.tweets 等等) O(N),N是订阅的模式的数量. 接收到的信息 PUBLISH channe

Redis源码解析:30发布和订阅

Redis的发布与订阅功能,由SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,以及PUBLISH等命令实现. 通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道.当有客户端通过PUBLISH命令向某个频道发布消息时,频道的所有订阅者都会收到这条消息. 除了订阅具体的频道之外,客户端还可以通过执行PSUBSCRIBE命令订阅一个或多个频道模式.当有客户端通过PUBLISH命令向某个频道发布消息时,消息不仅会被发送给这个频道的所有订阅者,它还会发

发布和订阅

发布和订阅是一种消息通信模式. 优点:使消息订阅者和消息发布者耦合度降低,类似设计模式中的观察者模式. Redis 的发布和订阅 发布和订阅 订阅的命令如下: // 订阅一个或多个频道 subscribe channel1 channel2 channel3 ... // 模式订阅,频道参数类似正则表达式 psubscribe abc* xyz* ... 发布命令如下: publish channel msg 启动一个订阅者客户端 X 订阅 cctv-1 返回三个参数:subscribe 订阅成

python之上下文管理、redis的发布订阅

使用with打开文件的方式,是调用了上下文管理的功能 1 #打开文件的两种方法: 2 3 f = open('a.txt','r') 4 5 with open('a.txt','r') as f 6 7 实现使用with关闭socket 8 import contextlib 9 import socket 10 11 @contextlib.contextmanage 12 def Sock(ip,port): 13 socket = socket.socket() 14 socket.bi