文档章节

Redis发布与订阅——PUBLISH & SUBSCRIBE

秋风醉了
 秋风醉了
发布于 2016/04/13 14:41
字数 706
阅读 128
收藏 4

Redis发布与订阅——PUBLISH  & SUBSCRIBE

一般来说,发布与订阅(又称pub/sub)的特点是订阅者(listener)负责订阅频道(channel),发送者(publisher)负责向频道发送二进制字符串消息(binary string message)。每当有消息发送至给定频道时,频道的订阅者都会收到消息。我们也可以把频道看作是电台,其中订阅者可以同时收听多个电台,而发送者则可以在任何电台发送消息。

发布与订阅的模式

Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。

作为例子, 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:


发布与订阅相关命令

订阅和发布

首先打开一个cli,订阅一个频道,如下,

127.0.0.1:7000> subscribe mychannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1

然后向该频道发送一个消息,如下,

127.0.0.1:7000> publish mychannel 'hell world'
(integer) 1
127.0.0.1:7000>

刚才的客户端已经订阅了该频道,所以该频道就会收到消息,如下,

➜  ~ redis-cli -p 7000
127.0.0.1:7000> subscribe mychannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1
1) "message"
2) "mychannel"
3) "hell world"


其他命令:

UNSUBSCRIBE——退订给定的一个或多个频道,如果执行是没有给定任何频道,那么退订所有频道

PSUBSCRIBE——PSUBSCRIBE pattern [pattern ...] 订阅与给定模式相匹配的所有频道

PUNSUBSCRIBE——PUNSUBSCRIBE  [pattern [pattern ...]] 退订给定的模式,如果执行是没有给定任何模式,那么退订所有模式。


使用Jedis客户端实现发布与订阅

首先实现一个Listener,用于订阅消息,接收消息,

package com.usoft.jedis.sample;

import redis.clients.jedis.JedisPubSub;

/**
 * Created by xinxingegeya on 16/4/13.
 */
public class MessageListener extends JedisPubSub {
    @Override
    public void onMessage(String channel, String message) {
        System.out.println("channel:" + channel + ",message:" + message);
        //此处我们可以取消订阅
        if (message.equalsIgnoreCase("quit")) {
            this.unsubscribe(channel);
        }
    }
}

写一个测试类,实现订阅和发布,

package com.usoft.jedis.sample;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * Created by xinxingegeya on 16/4/13.
 */
public class PubSubTest {
    /**
     * jedis连接池
     */
    public JedisPool jedisPool;
    /**
     * 发布和订阅的频道
     */
    public String channel = "mychannel";

    @Before
    public void before() {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(10);
        config.setMaxIdle(5);
        config.setMaxWaitMillis(5000);
        config.setTestOnBorrow(true);
        jedisPool = new JedisPool(config, "127.0.0.1", 7000);
    }

    @After
    public void after() {
        jedisPool.close();
    }

    @Test
    public void subscribe() {
        Jedis jedis = jedisPool.getResource();
        jedis.subscribe(new MessageListener(), channel);
    }

    /**
     * 发布9次消息后,在此发送quit消息,使listener(订阅者)关闭
     */
    @Test
    public void publish() {
        Jedis jedis = jedisPool.getResource();
        for (int i = 0; i < 10; i++) {
            if (i == 9) {
                jedis.publish(channel, "quit");
            } else {
                jedis.publish(channel, "hello world");
            }
        }
    }
}

=========END=========

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 239
博文 572
码字总数 416654
作品 0
朝阳
程序员
私信 提问
加载中

评论(4)

菜鸟0001
菜鸟0001

引用来自“菜鸟0001”的评论

大神你好 !请问取消订阅的方法应该怎么实现?就是图一中的 this.unsubscribe(channel) 方法,应该怎么实现它

引用来自“xxggy”的评论

this.unsubscribe(channel)怎么实现? 如果取消订阅的直接调用这个方法就可以了。
是不是频道被订阅次数?
菜鸟0001
菜鸟0001

引用来自“菜鸟0001”的评论

大神你好 !请问取消订阅的方法应该怎么实现?就是图一中的 this.unsubscribe(channel) 方法,应该怎么实现它

引用来自“xxggy”的评论

this.unsubscribe(channel)怎么实现? 如果取消订阅的直接调用这个方法就可以了。
谢谢大神!试了好用,再次请教您一个问题,就是在继承JedisPubSub 实现监听的时候,有一些方法比如onSubscribe,onUnsubscribe等,有一个int subscribedChannels 参数 ,这个参数是什么含义?比较才一直弄不明白,感谢!!
秋风醉了
秋风醉了

引用来自“菜鸟0001”的评论

大神你好 !请问取消订阅的方法应该怎么实现?就是图一中的 this.unsubscribe(channel) 方法,应该怎么实现它
this.unsubscribe(channel)怎么实现? 如果取消订阅的直接调用这个方法就可以了。
菜鸟0001
菜鸟0001
大神你好 !请问取消订阅的方法应该怎么实现?就是图一中的 this.unsubscribe(channel) 方法,应该怎么实现它
小蚂蚁学习Redis笔记(12)——Redis重要特性——发布及订阅消息

发布及订阅消息 发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,Redis作为一个sub/pub的server,订阅自己感兴趣的消息类型,Redis将信息类型称...

嗜学如命的小蚂蚁
2015/11/20
0
0
服务器(11)--Redis发布和订阅(pub/sub)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013043341/article/details/82856575 一、Redis发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者...

Reka
09/26
0
0
Redis——发布订阅(subscribe)

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

Allenyan
05/13
0
0
redis 事务及锁应用/发布订阅/

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

泡海椒
2016/04/04
35
0
Redis:pub/sub实现消息发布/订阅

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

特拉仔
06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《资治通鉴》读书笔记及阅读感悟2200字

《资治通鉴》读书笔记及阅读感悟2200字: 1.用夏桀,商纣暴虐昏君和商汤,周武王仁德明君做比较,因为人民归心,上天赐名要不然就永远要恪守臣节至死不渝。 又用商朝的微子取代纣王,商朝可以...

原创小博客
18分钟前
1
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
56分钟前
2
0
Docker搭建代码质量检测平台-SonarQube(中文版)

Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量。通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言...

Jacktanger
今天
2
0
Windows / Linux / MacOS 设置代理上网的方法汇总

本文汇总了 Windows / Linux / MacOS 设置代理上网的各种方法,总结如下: 1、设置系统代理(Windows、Linux、MacOS) 2、设置代理插件(Chrome、Chromium、Firefox、Opera、QQ等浏览器) 3、...

sunboy2050
昨天
4
0
自定义 Maven 的 repositories

有时,应用中需要一些比较新的依赖,而这些依赖并没有正式发布,还是处于milestone或者是snapshot阶段,并不能从中央仓库或者镜像站上下载到。此时,就需要 自定义Maven的<repositories>。 ...

waylau
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部