当前位置: 移动互联网学院 > Java培训 > JAVA开发 > Redis监听(发布与订阅)
Redis监听(发布与订阅) 时间:2017-05-18     来源:华清远见JAVA学院

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

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

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

在redis中:

使用publish channel message即可向指定的channel发布信息,注意只能向一个channel发送消息

使用subscribe channel [channel2...]即可监听指定的channel,注意可以同时监听多个channel

示例:

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

直接使用Redis控制台发布/订阅信息:监听channel1

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

直接使用Redis控制台发布/订阅信息:向channel1发送消息

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

直接使用Redis控制台发布/订阅信息:控制台收到消息

这样就完成了一个完整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();

}}

需要注意:

由于订阅以后回阻塞线程等待,固一般单独开一个线程进行监听

停止监听要记得释放资源,或者像上面的例子一样直接关闭线程

X