zoukankan      html  css  js  c++  java
  • 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等。

  • 相关阅读:
    Windows 之间用rsync同步数据(cwRsyncServer配置)
    学习blus老师js(5)--DOM操作应用高级
    学习blus老师js(4)--DOM
    scrollWidth,clientWidth,offsetWidth的区别 ---转载的
    学习blus老师js(3)--定时器的使用
    学习blus老师js(2)--深入JavaScript
    学习blus老师js(1)--基础
    转转转---ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法
    转转转--oracle 去重并按时间排序取第一条
    java正则表达式实战例子,持续更新,记下来后面就不用重新写了。。。
  • 原文地址:https://www.cnblogs.com/LOVE0612/p/5700287.html
Copyright © 2011-2022 走看看