Redis监听(发布与订阅)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

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

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

在redis中:

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

示例:

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

           Redis监听(发布与订阅)_第1张图片

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

           Redis监听(发布与订阅)_第2张图片

  • 可以看到第一个控制台中收到了消息 Redis监听(发布与订阅)_第3张图片

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

需要注意:

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

 

转载于:https://my.oschina.net/pierrecai/blog/903648

你可能感兴趣的:(Redis监听(发布与订阅))