zoukankan      html  css  js  c++  java
  • redis发布订阅模式

    一 前言

    虽然有消息队列,我们还是要了解一下redis发布订阅模式哟!!!!!

    二发布订阅模式

    • PUBLISH 命令向通道发送信息,此客户端称为publisher 发布者;
    • SUBSCRIBE 向命令通道订阅信息,此客户端称为subscriber 订阅者;
    • redis 中 发布订阅模块的名字叫着 PubSub,也就是 PublisherSubscriber;
    • 一个发布者向一个通道发送消息,订阅者可以向多个通道订阅消息;当发布者向通道发布消息后,如果有订阅者订阅该通道,订阅者就会收到消息;这有点像电台,我收听了一个电台的频道,当频道发送消息后,我就能收到消息;

    三PUBSub模块命令

    • subscribe: 订阅一个或者多个频道;
    • unsubscribe: 退订一个或者多个频道;
    • publish: 向通道发送消息;
    • psubscribe: 订阅给定模式相匹配的所有频道;
    • punsubscribe: 退订 给定模式所有的频道,若未指定模式,退订所有频道;

    具体的命令使用方式 可以使用 help 命令 ;示例如下:

    help subscribe
    

    四客户端实现

    通过指令SUBSCRIBE订阅一个频道,如果频道不存在时则新建一个频道;此时此客户端就是订阅者

    127.0.0.1:6379> subscribe zszxz
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "zszxz"
    3) (integer) 1
    
    

    通过指令publish向通道发送一个消息;此时客户端就是发布者

    127.0.0.1:6379> publish zszxz "l miss you"
    (integer) 1
    127.0.0.1:6379>
    

    我们再看看 客户端就收到消息了

    127.0.0.1:6379> subscribe zszxz
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "zszxz"
    3) (integer) 1
    1) "message"
    2) "zszxz"
    3) "l miss you"
    

    五java 实现

    定义2个订阅者用于订阅频道的消息,在使用jedis 时 需要 继承 JedisPubSub 类, 并重写 onMessage 方法; 订阅者可以在该方法里面进行消息的业务逻辑处理;

    订阅者 1

    /**
     * @Author lsc
     * <p>订阅者1号 </p>
     */
    @Component
    public class Sub1 extends JedisPubSub {
    
        @Override
        public void onMessage(String channel, String message) {
            System.out.println("sub1 channel is :"+ channel+ "  mesage is :"+message);
        }
    }
    

    订阅者2

    /**
     * @Author lsc
     * <p>订阅者2号 </p>
     */
    @Component
    public class Sub2 extends JedisPubSub {
    
        @Override
        public void onMessage(String channel, String message) {
            System.out.println("sub2 channel is :"+ channel+ "  mesage is :"+message);
        }
    }
    

    发布者

    /**
     * @Author lsc
     * <p> </p>
     */
    @Component
    public class Pub {
    
        public void publishMessage(Jedis jedis, String channel, String msg) {
            jedis.publish(channel,msg);
        }
    }
    

    测试类、

    注意redis 的 发布订阅模式 是阻塞模式 ,一个订阅者需要 重新起一个线程;

        @Autowired
        Pub pub;
    
        @Autowired
        JedisUtil jedisUtil;
    
        @Autowired
        Sub1 sub1;
    
        @Autowired
        Sub1 sub2;
    
        @Test
        public void test(){
    
            new Thread(()-> {
                while (true){
                    jedisUtil.getJedis().subscribe(sub1,"zszxz");
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //jedisUtil.getJedis().subscribe(sub2,"zszxz");
            }).start();
            pub.publishMessage(jedisUtil.getJedis(),"zszxz","l miss you");
        }
    

    六 缺点

    • PubSub 的生产者来一个消息会直接传递给消费者。如果没有消费者,消息会直接丢弃。如果有多个消费者,一个消费者突然挂掉,生产者会继续发送消息,另外的消费者可以持续收到消息。但是挂掉的消费者重新连上后,断连期间的消息会彻底丢失;
    • 如果 Redis 停机重启,PubSub 的消息是不会持久化

    求关注

  • 相关阅读:
    JavaScript 开发进阶:理解 JavaScript 作用域和作用域链
    jquery插件 源码
    webkit浏览器渲染影响因素分析
    JS操作JSON总结
    转:ie6与firefox操作iframe中DOM节点的一点不同
    input:focus
    JS设计模式一:单例模式
    JavaScript 变量、函数与原型链
    让你提前认识软件开发(49):自己主动測试
    Docker 开源管理工具集锦
  • 原文地址:https://www.cnblogs.com/zszxz/p/13509254.html
Copyright © 2011-2022 走看看