redis(四)----发布订阅

    发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合。pub /sub不仅仅解决发布者和订阅者直接代码级别耦合,也解决两者在物理部署上的耦合。废话不多说,直接上代码

public class PubSub {
    private final String redisChanel1 = "redisChanel1";
    private final String redisChanel2 = "redisChanel2";

    private String redisHost = "10.5.31.155";
    private int redisPort = 6379;
    private Jedis redis;


    @Before
    public void before() {
        redis = new Jedis(redisHost, redisPort);
    }


    @Test
    public void pubChanel1() throws InterruptedException {
        for (int i = 0; i < 1000; i++) {
            // 通过redis的“redisChanel1”频道发布消息
            redis.publish(redisChanel1, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 第" + i + "条消息");
            // 消息发布后随即sleep 0-2s
            Thread.sleep(Math.round(Math.floor(Math.random() * 2000)));
        }
    }

    @Test
    public void pubChanel2() throws InterruptedException {
        for (int i = 0; i < 1000; i++) {
            // 通过redis的“redisChanel2”频道发布消息
            redis.publish(redisChanel2, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 第" + i + "条消息");
            // 消息发布后随即sleep 0-2s
            Thread.sleep(Math.round(Math.floor(Math.random() * 2000)));
        }
    }

    @Test
    public void sub() {
        // 同时订阅“redisChanel1”频道和“redisChanel2”频道的消息并输出到控制台
        redis.subscribe(new JedisPubSub() {
            @Override
            public void onMessage(String channel, String message) {
                System.out.println(channel + "-->" + message);
            }
        }, redisChanel1, redisChanel2);
    }

    @After
    public void after() {
        redis.close();
    }

}

 先运行sub方法,再运行pubChanel1、pubChanel2方法,可以看到输出:

redisChanel1-->2018-09-27 18:04:34 第0条消息
redisChanel1-->2018-09-27 18:04:35 第1条消息
redisChanel2-->2018-09-27 18:04:36 第0条消息
redisChanel2-->2018-09-27 18:04:36 第1条消息
redisChanel1-->2018-09-27 18:04:36 第2条消息
redisChanel1-->2018-09-27 18:04:38 第3条消息
redisChanel1-->2018-09-27 18:04:38 第4条消息
redisChanel2-->2018-09-27 18:04:38 第2条消息
redisChanel1-->2018-09-27 18:04:39 第5条消息
...

先运行pubChanel1、pubChanel2方法,再运行sub方法,可以看到输出:

redisChanel2-->2018-09-27 18:05:56 第2条消息
redisChanel1-->2018-09-27 18:05:57 第3条消息
redisChanel1-->2018-09-27 18:05:57 第4条消息
redisChanel2-->2018-09-27 18:05:57 第3条消息
redisChanel1-->2018-09-27 18:05:58 第5条消息
redisChanel2-->2018-09-27 18:05:58 第4条消息
redisChanel2-->2018-09-27 18:05:59 第5条消息
...

也就说明:在消费者下线的情况下,生产者生产的消息会丢失。如果要避免这种问题,需要使用专业的消息队列如rabbitMQ等。

posted @ 2016-07-24 10:59  柚子苹果果  阅读(353)  评论(0编辑  收藏  举报