发布与订阅(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();
}}
需要注意:
由于订阅以后回阻塞线程等待,固一般单独开一个线程进行监听
停止监听要记得释放资源,或者像上面的例子一样直接关闭线程
热点新闻