Redis资料汇总(六) 发布订阅

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。 pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合。redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息。

下面做个实验。这里使用两个不同的client一个是redis自带的redis-cli另一个是用java写的简单的client。代码如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

import java.io.*;

import java.net.*;

public class PubSubTest {

    public static void main(String[] args) {

        String cmd = args[0] + "\r\n";

        try {

            Socket socket = new Socket("192.168.56.55", 6379);

            InputStream in = socket.getInputStream();

            OutputStream out = socket.getOutputStream();

            out.write(cmd.getBytes());

            //发送订阅命令

            byte[] buffer = new byte[1024];

            while (true) {

                int readCount = in.read(buffer);

                System.out.write(buffer, 0, readCount);

                System.out.println("--------------------------------------");

            }

        } catch (Exception e) {

        }

    }

}

代码就是简单的从命令行读取传过来的订阅命令,然后通过一个socket连接发送给redis server,然后进入while循环一直读取redis server传过来订阅的消息。并打印到控制台
1 首先编译并运行此java程序(我是win7下面运行的)

D:\>javac PubSubTest.java
D:\>java PubSubTest "subscribe
news.share
news.blog"
*3
$9
subscribe
$10
news.share
:1
*3
$9
subscribe
$9
news.blog
:2

--------------------------------------
2 启动redis-cli

redis> psubscribe news.*
Reading messages... (press
Ctrl-c to quit)
1. "psubscribe"
2. "news.*"
3. (integer) 1

3 再启动一个redis-cli用来发布两条消息

redis> publish news.share "share a link
http://www.google.com"
(integer) 2
redis> publish
news.blog "I post a blog"
(integer) 2

4.查看两个订阅client的输出
此时java client打印如下内容

*3
$7
message
$10
news.share
$34
share a link
http://www.google.com
--------------------------------------
*3
$7
message
$9
news.blog
$13
I
post a blog

--------------------------------------
另一个redis-cli输出如下

1. "pmessage"
2. "news.*"
3. "news.share"
4. "share a link
http://www.google.com"
1. "pmessage"
2. "news.*"
3. "news.blog"
4.
"I post a blog"

分析下

java client使用subscribe命令订阅news.share和news.blog两个通道,然后立即收到server返回的订阅成功消息,可以看出 redis的协议是文本类型的,这里不解释具体协议内容了,可以参考http://redis.io/topics/protocolhttp://terrylee.me/blog/post/2011/01/26/redis-internal-part3.aspx。这个报文内容有两部分,第一部分表示该socket连接上使用 subscribe订阅news.share成功后,此连接订阅通道数为1,后一部分表示使用subscribe订阅news.blog成功后,该连接订 阅通道总数为2。

redis
client使用psubscribe订阅了一个使用通配符的通道(*表示任意字符串),此订阅会收到所有与news.*匹配的通道消息。redis-
cli打印到控制台的订阅成功消息表示使用psubscribe命令订阅news.*成功后,连接订阅通道总数为1。
当我们在一个client使用publish 向news.share和news.blog通道发出两个消息后。redis返回的(integer) 2表示有两个连接收到了此消息。通过观察两个订阅者的输出可以验证。具体格式不解释了,都比较简单。


完一个小例子后应该对pub/sub功能有了一个感性的认识。需要注意的是当一个连接通过subscribe或者psubscribe订阅通道后就进入订
阅模式。在这种模式除了再订阅额外的通道或者用unsubscribe或者punsubscribe命令退出订阅模式,就不能再发送其他命令。另外使用
psubscribe命令订阅多个通配符通道,如果一个消息匹配上了多个通道模式的话,会多次收到同一个消息。

jredis目前版本没提供pub/sub支持,不过自己实现一个应该也挺简单的。整个应用程序可以共享同一个连接。因为redis返回的消息报文中除了消息内容本身外还包括消息相关的通道信息,当收到消息后可以根据不同的通道信息去调用不同的callback来处理。

另外个人觉得redis的pub/sub还是有点太单薄(实现才用150行代码)。在安全,认证,可靠性这方便都没有太多支持。

时间: 2024-08-28 06:07:17

Redis资料汇总(六) 发布订阅的相关文章

Redis资料汇总专题(转)

原文:Redis资料汇总专题 很多朋友反映,说NoSQLFan上的资料不少,但是要找到自己实用的太难,于是萌生做这样一个专题的想法.通过将不同NoSQL产品从入门到精通的各种资料进行汇总,希望能够让大家更快的找到适合自己的教程或文章进行阅读. 最后更新时间:2013-04-22 1.Redis是什么? 十五分钟介绍 Redis数据结构 Redis系统性介绍 一个很棒的Redis介绍PPT 强烈推荐!非同一般的Redis介绍 Redis之七种武器 锋利的Redis redis 适用场景与实现 [翻

redis资料汇总

redis资源比较零散,引用nosqlfan上的文章,方便大家需要时翻阅.大家看完所有的,如果整理出文章的,麻烦知会一下,方便学习. 1.Redis是什么? 十五分钟介绍 Redis数据结构 Redis系统性介绍 一个很棒的Redis介绍PPT 强烈推荐!非同一般的Redis介绍 Redis之七种武器 锋利的Redis redis 适用场景与实现 [翻译]Redis协议 2.Redis内部实现 Redis源码分析系列文章 Redis运行流程源码解析 Redis 2.6 Lua 脚本功能实现分析

Redis基本使用 之——发布/订阅

一.说明: 订阅,取消订阅和发布实现了发布/订阅消息范式(引自wikipedia),发送者(发布者)不是计划发送消息给特定的接收者(订阅者).而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅.订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的.这种发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑. 二.发布及订阅功能: 基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交

Redis:八、发布订阅实现原理

Redis:相关内容 Redis发布订阅常用命令1.psubscribe pattern [pattern...]//订阅一个或多个符合给定模式的频道2.pubsub subcommand [argument[argument...]]//查看订阅与发布系统状态3.publish channel message将消息发送到指定的频道4.punsubscribe [pattern [pattern...]]退订所有给行模式的频道5.subscribe channel [channel...]订阅给

redis(4)----发布订阅

  一. redis发布订阅简介         发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合,也解决两者在物理部署上的耦合. 二. 测试源码     1. 首先启动redis     2. 发布         新建一个Java Project,然后再新建一个class,为其增加main方法来向redis发布消息: package com.luych.message.publish; i

redis学习笔记之发布订阅

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合.redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel).当发布者通过publish命令向

Redis 命令参考——PubSub(发布订阅)

PubSub(发布订阅)PUBLISH PUBLISH channel message 将信息 message 发送到指定的频道 channel . 可用版本: >=2.0.0 时间复杂度: O(N+M),其中 N 是频道 channel 的订阅者数量,而 M 则是使用模式订阅(subscribed patterns)的客户端的数量. 返回值: 接收到信息 message 的订阅者数量. # 对没有订阅者的频道发送信息 redis>publish bad_channel "can a

Redis资料汇总(一) 环境搭建

1.简介 redis是一个开源的key-value数据库.它又经常被认为是一个数据结构服务器.因为它的value不仅包括基本的string类型还有 list,set ,sorted set和hash类型.当然这些类型的元素也都是string类型.也就是说list,set这些集合类型也只能包含string 类型.你可以在这些类型上做很多原子性的操作.比如对一个字符value追加字符串(APPEND命令).加加或者减减一个数字字符串(INCR命令,当 然是按整数处理的).可以对list类型进行pus

redis学习3--redis功能 发布订阅,HyperLogLog,GEO,Lua等等

1 HyperLogLog HyperLogLog是一种字符串类型的数据结构,一种利用极小的内存完成大量独立用户数据统计,但是存在误差(官方0数字.81%). 2 发布与订阅 redis 不能做消息队列堆积,就是说最新的订阅者无法收到订阅前的消息 消息队列与发布订阅,消息队列是多个客户端抢消息,发布订阅是每个客户端都可以收到消息,这是他们的区别. 3 GEO GEO 支持存储位置信息,来实现附件的人,摇一摇等功能. 原文地址:https://www.cnblogs.com/tjqBlog/p/9