Redis的发布和订阅

Redis的发布和订阅

Redis发布订阅(pub/sub)是一种消息通信模式,pub发布消息,sub接收消息。(pub/sub)是一种生产者消费者模式,是实现消息队列的一种方式

redis的订阅和发布是解耦和多播的方式。且是一种消息队列的方式,可以实现系统解耦,削峰填谷,顶住流量洪峰。但redis的订阅和发布只是redis的一种尝试,redis的主要业务还是键值对的数据存储,缓存等,实际主流的消息队列有ActiveMQ,RabbitMQ等

操作方式

sub方要先订阅某个频道
进入redis-cli之后,执行 subsribe channelName。其中channelName支持模式匹配即使用*能匹配多个频道

然后发布方发布消息,接收方就能收到,执行: publish channelName content

接收方:要现有接收方,发布方的消息才能被收到,且接收方会一直监听消息
代码简单实现

package com.swagger.ranger.redis.Pub_Sub;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

/*******************************************************************************
 * @Copyright (C), 2018-2019,github:Swagger-Ranger 
 * @FileName: RedisSubcriber
 * @Author: liufei32@outlook.com
 * @Date: 2019/3/24 18:08
 * @Description: redis发布者
 * @Aha-eureka:  JedisPubSub是一个定义的抽象类,在这个类中定义publish/subscribe 回调方法,
 *               通过继承JedisPubSub类并重写回调方法,当publish/subscribe 事件发生时,我们可以自己定制处理逻辑
 *
 *               JedisPubSub的使用方法为:在一个Jedis的连接中调用其中的subscribe方法并传入JedisPubSub的子类,和频道名;
 *               就可以自动接收订阅消息
 *******************************************************************************/

public class RedisSubcriber extends JedisPubSub {

    /**
     * onMessage是一个回调的自动方法,当有消息时会自动执行该方法
     * 重写本方法来实现自己的业务逻辑处理
     * @param channel
     * @param message
     */
    @Override
    public void onMessage( String channel, String message ) {
        System.out.println("channel[" + channel + "] published a message that is [" + message + "]");
    }


    public static void main( String[] args ) {
        Jedis jedis = new Jedis("120.27.227.49", 6379);
        RedisSubcriber redisSubcriber = new RedisSubcriber();
        jedis.subscribe(redisSubcriber, "channel1");
    }

}

发布方

package com.swagger.ranger.redis.Pub_Sub;

import redis.clients.jedis.Jedis;

/*******************************************************************************
 * @Copyright (C), 2018-2019,github:Swagger-Ranger
 * @FileName: RedisPublisher
 * @Author: liufei32@outlook.com
 * @Date: 2019/3/24 18:29
 * @Description: Redis的发布者
 * @Aha-eureka:  redis消息的发布者不需要继承或者实现某个类和接口,Jedis类直接就可以调用publish()方法发布消息
 *******************************************************************************/

public class RedisPublisher {

    public static void main( String[] args ) {
        Jedis jedis = new Jedis("120.27.227.49", 6379);
        jedis.publish("channel1", "Swagger-Ranger");

        jedis.close();
    }
}

本博客为Swagger-Ranger的笔记分享,文中源码地址: https://github.com/Swagger-Ranger
欢迎交流指正,如有侵权请联系作者确认删除: liufei32@outlook.com

posted on 2019-04-08 15:59  Swagger-Ranger  阅读(175)  评论(0编辑  收藏  举报

导航