文档章节

Redis发布与订阅——PUBLISH & SUBSCRIBE

秋风醉了
 秋风醉了
发布于 2016/04/13 14:41
字数 706
阅读 114
收藏 4
点赞 1
评论 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=========

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 223
博文 581
码字总数 411013
作品 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

Redis——发布订阅(subscribe)

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

Allenyan ⋅ 05/13 ⋅ 0

快速掌握Redis——第五招:pub/sub 发布/订阅

1 简易模型 订阅端: Subscribe 频道名称发布端: publish 频道名称 发布内容(远程主机新建两个ssh连接,分别执行pub和sub任务)格式: publish redisChat messagesubscribe redisChatredisC...

vasks ⋅ 2015/03/27 ⋅ 0

redis 事务及锁应用/发布订阅/

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

泡海椒 ⋅ 2016/04/04 ⋅ 0

Redis:pub/sub实现消息发布/订阅

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

特拉仔 ⋅ 06/01 ⋅ 0

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

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

超人学院 ⋅ 2015/05/28 ⋅ 0

Redis发布与订阅功能

发布/订阅”功能包含两种角色:发布者和订阅者。Redis的发布与订阅功能由publish、subscribe、psubscribe等命令组成。通过执行publish命令可以发布消息;通过执行subscribe命令,客户端可以订...

u012050154 ⋅ 2017/11/29 ⋅ 0

redis 发布与定阅

直接看发布与定阅,容易让人迷糊。什么发布者和消息订阅者之间的耦合,什么通道, 先看下面的表格,等你照着做一遍就知道是怎么回事了。(linux 平台下) 先启动~$ redis-server 启动一个cli...

山下狮子 ⋅ 2014/06/19 ⋅ 0

redis源码分析之发布订阅(pub/sub)

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

凌风郎少 ⋅ 2017/11/05 ⋅ 0

架构设计:系统存储(16)——Redis事件订阅和持久化存储

接上文《架构设计:系统存储(15)——Redis基本概念和安装使用》 3-4、事件功能和配置项 Redis从2.X版本开始,就支持一种基于非持久化消息的、使用发布/订阅模式实现的事件通知机制。所谓基...

yinwenjie ⋅ 2016/12/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Hive函数

1.函数explode (一转多) create table hive_wc(sentence string); load data local inpath '/home/hadoop/data/hive-wc.txt' into table hive_wc; 结果: hive > select * from hive_wc; ......

GordonNemo ⋅ 17分钟前 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 34分钟前 ⋅ 0

使用Java connector消费ABAP系统的函数

Java Connector(JCO)环境的搭建:Step by step to download and configure JCO in your laptop 我的ABAP系统有个函数名叫ZDIS_GET_UPSELL_MATERIALS,输入一个customer ID和product ID,会输......

JerryWang_SAP ⋅ 40分钟前 ⋅ 0

IDEA提示编码速度

焦点移动 将焦点冲代码编辑窗口移动到菜单栏:Alt+菜单栏带下划线字母 将焦点从工具窗口移动到代码编辑窗口 Esc或Shift+Esc 将焦点从代码编辑移动到最近使用的工具窗口 F12 模板提示 Ctrl+J...

bithup ⋅ 52分钟前 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

python3.6 安装pyhook_3

我的是在win下的,忙了半天老是安装不了, pip install 也不行。 那么可以看出自己的版本是32bit 一脸懵逼 没办法 只好下载32版本的来安装 我一直以为 是 对应32 位的 。 下面是 小例子 http...

之渊 ⋅ 今天 ⋅ 0

004、location正则表达式

1、location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。 2、location的语法 = 开头表示精确匹配 ^~...

北岩 ⋅ 今天 ⋅ 0

CentOS7 静默安装 Oracle 12c

环境 CentOS7.5 最小安装 数据库软件 linuxx64_12201_database.zip 操作系统配置 关闭 SELinux sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config 关闭防火墙 systemctl disable ......

Colben ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部