Redis监听(发布与订阅)

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

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

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

在redis中:

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

示例:

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

           145421_W9NO_2920923.png

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

           145534_pj1r_2920923.png

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值