文档章节

Redis发布与订阅——PUBLISH & SUBSCRIBE

秋风醉了
 秋风醉了
发布于 2016/04/13 14:41
字数 706
阅读 123
收藏 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=========

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 236
博文 577
码字总数 418437
作品 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
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
Redis 命令参考——PubSub(发布订阅)

PubSub(发布订阅) PUBLISH PUBLISH channel message 将信息 message 发送到指定的频道 channel 。 可用版本: >=2.0.0 时间复杂度: O(N+M),其中 N 是频道 channel 的订阅者数量,而 M 则是...

超人学院
2015/05/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

05-《深度拆解Java虚拟机》之JVM是如何执行方法调用的?(下)

一、问题引入 我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以作者就想在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文...

飞鱼说编程
26分钟前
1
0
nginx统一入口 多服务出口

nginx配置多ip和端口统一调用入口log_format中$upstream_addr 标识打印转发的url地址配置upstream和locationhttp {include mime.types;default_type application/octet-stream...

GoldenVein
28分钟前
1
0
阿里P9架构师谈:高并发网站的监控系统选型、比较、核心监控指标

在高并发分布式环境下,对于访问量大的业务、接口等,需要及时的监控网站的健康程度,防止网站出现访问缓慢,甚至在特殊情况出现应用服务器雪崩等场景,在高并发场景下网站无法正常访问的情况...

我是你大哥
30分钟前
1
0
华为HiAI 助力苏宁易购,让你尽享完美视觉购物体验!

还在感慨商品照片与实物存在差距,又要退货? 还在抱怨被忽视的图片小细节,影响了生活品质? 想要“买买买”, 又担心海量的商品图片耗光你的流量? 就在近期 搭载HiAI能力的苏宁易购新版上线...

华为终端开放实验室
31分钟前
1
0
聊聊redisson的RMap的computeIfAbsent操作

序 本文主要研究一下redisson的RMap的computeIfAbsent操作 实例 @Test public void testRMapComputeIfAbsent(){ Config config = new Config(); config.useSingleS......

go4it
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部