文档章节

Redis监听(发布与订阅)

兴趣使然的程序员
 兴趣使然的程序员
发布于 2017/05/18 15:21
字数 514
阅读 104
收藏 1

发布与订阅(publish/subscribe)的特点是订阅者(listener)负责订阅频道(channel),发送者(publisher)负责向频道发送二进制字符串消息。

每当有消息被发送至给定频道时,频道的所有订阅者都会收到消息。

1、直接使用Redis控制台发布/订阅信息

在redis中:

  • 使用publish channel message即可向指定的channel发布信息,注意只能向一个channel发送消息
  • 使用subscribe channel [channel2...]即可监听指定的channel,注意可以同时监听多个channel

示例:

  • 先打开一个控制台,监听channel1

           

  • 再打开一个控制台,向channel1发送消息

           

  • 可以看到第一个控制台中收到了消息 

这样就完成了一个完整publish/subsribe过程。

2、使用Jedis在Java程序汇总发布/订阅消息

2.1、发布消息

使用Jedis发布消息相对订阅来说比较简单,直接调用Jedis对象的publish方法即可:

public class JedisUtil{
    private static JedisPool jedisPool = new 
                               JedisPool(jedisPoolConfig,"localhost");
    /**
     * 作为生产者publish信息到制定的redis的channel
     * @param channel
     * @param msg
     */
    public static void sendMsg(String channel,String msg){
        Jedis jedis = jedisPool.getResource();
        jedis.publish(channel,msg);
        if (jedis!=null)jedis.close();
    }
}

2.2、订阅消息

Jedis中订阅消息主要通过JedisPubSub类实现,该类有多个回调方法,分别对应连接的不同时期。下面的例子只用了接收到信息时的回调方法。

public class RedisUtil{
    //用于接收redis传递的消息的线程
    private Thread redisThread;

    /**
     * 启动用于监听Redis消息的线程
     */
    public void startListenThread(String channel){
        redisThread = new Thread(()->{
            Jedis jedis = RedisDSUtils.getJedisPool().getResource();
            jedis.subscribe(new JedisPubSub() {
                //接收到消息时的回调方法
                @Override
                public void onMessage(String channel, String message) {
                    System.out.println(message);
                }
            },channel);   //channel和publish时用的channel相对应
        });
        redisThread.start();
    }

    /**
     * 停止用于监听Redis消息的线程
     */
    public void stopListenThread(){
        redisThread.interrupt();
    }
}

需要注意:

  • 由于订阅以后回阻塞线程等待,固一般单独开一个线程进行监听
  • 停止监听要记得释放资源,或者像上面的例子一样直接关闭线程

 

© 著作权归作者所有

兴趣使然的程序员
粉丝 23
博文 112
码字总数 87412
作品 0
深圳
程序员
私信 提问
laravel扩展使用redis消息发布与订阅

laravel扩展使用redis消息发布与订阅 业务场景 shell测试redis发布publish和订阅subscribe 结合laravel订阅消息并处理 业务场景 项目业务场景中需要去订阅兄弟部门的数据,技术栈这块经过商讨...

似阳似海
2018/12/05
0
0
Redis 订阅 Java实现

转载请标明出处 http://coderknock.com 源码:http://git.oschina.net/sanchan/SparkJsonRedis 消息publish端 消息订阅端 订阅端监听器 Redis订阅者与发布者: 订阅监听:...

拿客-三产
2016/06/02
1K
5
关于redis结合java实现消息的pub/sub功能的一些疑惑。。

还没开始用jedis写个关于消息队列的helloworld出来,提前说一下疑惑,望各位大牛指点一下~ 消息发布与订阅在redis指令中就是publish(发布)与subscribe(订阅),订阅者监听发布者 那么问题...

上帝爱众生
2015/10/24
482
0
Redis的Pub/Sub模式

Redis同样支持消息的发布/订阅(Pub/Sub)模式,这和中间件activemq有些类似。订阅者(Subscriber)可以订阅自己感兴趣的频道(Channel),发布者(Publisher)可以将消息发往指定的频道(C...

摆渡者
2016/01/12
7.9K
0
redis学习笔记(三)之其他命令和特性

redis学习笔记(一)之安装测试 redis学习笔记(二)之数据类型 一、基本特性 1、reids 默认端口:6379; 2、默认支持16个数据库,建立连接后自动选择0号数据库,建议不同的应用使用不同的r...

憨豆公子
2016/08/19
21
0

没有更多内容

加载失败,请刷新页面

加载更多

cmd命令与dos指令

bat命令学习 基础部分: 一、基础语法: 1.批处理文件是一个“.bat”结尾的文本文件,这个文件的每一行都是一条DOS命令。可以使用任何文本文件编辑工具创建和修改。 2.批处理是一种...

WinkJie
6分钟前
0
0
折叠手机适配布局

CSS Grid 设备相关参数 媒体查询 Chrome进行调试,创建相应的模拟机

lilugirl
36分钟前
2
0
Knative Eventing 中如何实现 Registry 事件注册机制

摘要: 在最新的 Knative Eventing 0.6 版本中新增了 Registry 特性, 为什么要增加这个特性, 该特性是如何实现的。针对这些问题,希望通过本篇文章给出答案。 背景 作为事件消费者,之前是...

阿里云云栖社区
40分钟前
1
0
安装 jemalloc for mysql

前言: Jemalloc 是BSD的提供的内存分配管理 安装依赖 $ yum install -y gcc$ yum install autoconf -y 安装 jemalloc $ git clone https://github.com/jemalloc/jemalloc$ cd jema......

Linux_Anna
50分钟前
3
0
linux下ctrl+c中止不了

有一台centos7的服务器,ctrl+c无效,并且tail -f也无效,只能关掉终端或者crtl+z放入后台再删掉,但是ping的时候使用ctrl+c是有效果的。 出现这种情况的原因可能是因为有人要使用ruby安装r...

gaolongquan
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部