文档章节

redis中的发布订阅(Pub/Sub)

c
 caiyezi
发布于 2016/11/08 20:23
字数 1295
阅读 19
收藏 0

这里使用nodejs的redis模块说明,具体可见https://www.npmjs.com/package/redis ,先来通过一个简单的例子了解下redis中的Pub/Sub具体怎么实现吧。。

var express = require('express');
var router = express.Router();
var redis = require("redis");
 /* GET home page. */
router.get('/', function(req, res, next) {

  var client1 = redis.createClient();
  var client2  = redis.createClient(6379,"192.168.20.132");
  var msg_count = 0;

  client1.on("error", function (err) {
    console.log("Error " + err);
  });

  client2.on("error",function(err){
    console.log(err);
  });

  client1.on("subscribe", function (channel, count) {     //channel为订阅的事件类型(通道),count为当前客户端订阅的channel总数
    client2.publish("a nice channel", "I am sending a message.");
    client2.publish("a nice channel", "I am sending a second message.");
    client2.publish("a nice channel", "I am sending my last message.");
    console.log("client1 sub count:" + count);
    console.log("client1 sub channel:" + channel);
  });

  client1.on("message", function (channel, message) {     //channel为send端所发送的订阅类型,message为该channel中所收到的信息
    console.log("client1 channel name: " + channel + "->message: " + message);
    msg_count += 1;
    if (msg_count === 3) {
      client1.unsubscribe();    //退订所有channel
      client1.end();    //client1退出Pub/Sub模式,可继续执行其它redis命令
      client2.end();
    }
  });
  client1.subscribe("a nice channel");  //自动触发"sunscribe"事件
  res.render('index', {title: 'Express'});
});
 module.exports = router;

 将上述代码保存为index.js文件,替换Express项目中的index.js,然后启动后浏览器中输入:localhost:3000,观察Webstorm中打印信息如下:

client1 sub count:1
client1 sub channel:a nice channel
client1 channel name: a nice channel->message: I am sending a message.
client1 channel name: a nice channel->message: I am sending a second message.
client1 channel name: a nice channel->message: I am sending my last message.

 这里来说明下:

  • require来redis模块后,通过redis的createClient方法创建 redis客户端连接,该方法可以指定三个参数,分别为:连接的redis server端口、server ip及可配置的options。不带任何参数时默认连接本机redis server的6379端口,编码时也可使用createClient(6379,"ip address",{})的options为空的形式使用默认配置,当然也可直接省略options对象
  • error事件为client端操作报错时自动触发的事件
  • subscribe事件和message事件稍后说明

 

发布订阅

redis中的发布订阅,自我的理解是:发布订阅就是有一端发布消息,一端订阅消息即接收消息,这里的发布订阅端都可以称为client端,也就是说一个client既可以发布多个消息,亦可以订阅多个消息。

说 到消息,到底什么是消息?redis中的每条消息是一条带有三个元素的多条批量回复(multi-bulk-reply)。这货刚听时候着实难以理解,下 面继续。这里的第一个元素是消息类型,redis中消息类型并非我们理解的String、Object等,而是subscribe、 unsubscribe、message等类型。

  • subscribe:如果类型为subscribe,则表示当前客户端成功订阅 了第二个元素所示频道(频道可以理解为消息的名称或channel,因为redis中client端发布消息后,redis server端再根据其它客户端是否订阅该名称或channel而转发该消息至订阅端),这时信息的第三个元素则记录了目前客户端已订阅频道的总数
  • unsubscribe:表示当前客户端成功地退订了信息第二个元素所指示的频道。 信息的第三个元素记录了客户端目前仍在订阅的频道数量。 当客户端订阅的频道数量降为 0 时, 客户端不再订阅任何频道, 它可以像往常一样, 执行任何 Redis 命令
  • message:表示这条信息是由某个客户端执行 PUBLISH命令所发送的, 真正的信息。 信息的第二个元素是信息来源的频道, 而第三个元素则是信息的内容

如果客户端执行以下命令:

redis> SUBSCRIBE first second

 表明该客户端订阅了名称为first和second的两个channel,那么它将收到以下回复:

1) "subscribe"
2) "first"
3) (integer) 1

1) "subscribe"
2) "second"
3) (integer) 2

 其中,subscribe表明此消息类型,first为channel名称,(integer) 1表示当前客户端订阅的channel总数为1,如果此时另一个客户端执行了如下命令:

redis> PUBLISH second Hello

 表示该客户端发布了一个channel为second,内容为hello的一条信息,那么之前订阅了channel为second的客户端将收到以下信息:

1) "message"
2) "second"
3) "hello"

 其中,message表明该消息为另一客户端发送而来,second为channel名,此时hello为信息内容。如果这时订阅的客户端再执行以下命令:

redis> UNSUBSCRIBE

表明订阅者退订所有之前订阅的channel,这时命令执行后收到回复如下:

1) "unsubscribe"
2) "second"
3) (integer) 1

1) "unsubscribe"
2) "first"
3) (integer) 0

可以看到消息退订时是一条条挨个退订,而且是“后订先退”顺序,当然也可以直接指定退订的channel。

有一点觉得比较重要:

通过PUBLISH发出去的信息,是不会保存在服务端的,服务端只是做中转处理。也就是说,如果客户端PUBLISH了信息至channel,而没有其它客户端订阅该channel,那么该消息也是无效的,消息的传递是以channel为载体的。

本文转载自:http://www.cnblogs.com/vipzhou/p/4762841.html

共有 人打赏支持
c
粉丝 1
博文 108
码字总数 0
作品 0
西安
程序员
Redis学习笔记~分布式的Pub/Sub模式

redis的客户端有很多,这次用它的pub/sub发布与订阅我选择了StackExchange.Redis,发布与订阅大家应该很清楚了,首先一个订阅者,订阅一个服务,服务执行一些处理程序(可能是写个日志,插入...

mcy247
2017/12/07
0
0
Redis:pub/sub实现消息发布/订阅

转载自http://www.runoob.com/redis/redis-pub-sub.html Redis 发布订阅 Redis 的 Pub/Sub 可以用来实现简单的订阅机制。一个或多个 client 向 Redis 订阅特定的频道,当某个 client 向这个频...

特拉仔
06/01
0
0
redis 事务及锁应用/发布订阅/

分类: NoSQL MySQL Redis 开启 Start transaction mutil 语句 普通SQL 普通命令 失败 rollback discard 成功 commit exec 注:rollback和discard的区别,如果已经成功执行了2条语句,第三条语...

泡海椒
2016/04/04
35
0
Redis——发布订阅(subscribe)

Redis发布订阅(pub/sub)是一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息。 Redis客户端可以订阅任意数量的频道。 发布订阅的基本命令 1、SUBSCRIBE channel [ channel...

Allenyan
05/13
0
0
redis源码分析之发布订阅(pub/sub)

redis算是缓存界的老大哥了,最近做的事情对redis依赖较多,使用了里面的发布订阅功能,事务功能以及SortedSet等数据结构,后面准备好好学习总结一下redis的一些知识点。 先看下redis发布订阅...

凌风郎少
2017/11/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

go语言学习总结

一、描述 go语言是直接将源码编译成二进制机器码的语言;它支持面向对象、也支持函数式编程;支持并发很容易; 二、基本语法学习路径 https://studygolang.com/subject/2...

盼望明天
16分钟前
1
0
JSP 九大内置对象及其作用域

JSP 中一共预先定义了 9 个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception ,下面就简单介绍下。 1、request 对象 request 对象...

几个栗子
27分钟前
0
0
Java中的坑之方括号

Java中的坑之方括号 这一段时间,在做项目的时候,发现了一个坑,这个坑说大不大,说小不小,不知道的足够喝一壶,知道的就可以轻松解决。 问题描述 在做数据统计的时候,遇见了如下形式的数...

星汉
37分钟前
1
0
[雪峰磁针石博客]python机器学习、web开发等书籍汇总

Building Machine Learning Systems with Python Third Edition - 2018.pdf 下载地址 Get more from your data by creating practical machine learning systems with Python Key Features ......

python测试开发人工智能安全
48分钟前
1
0
文件的压缩与解压(linux)

Linux下*.tar.gz文件解压缩命令 1.压缩命令:   命令格式:tar -zcvf 压缩后文件名.tar.gz 被压缩文件名 可先切换到当前目录下。压缩文件名和被压缩文件名都可加入路径。 2.解压缩命令: ...

qimh
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部