redis发布(pub)、订阅(sub)模式

前言:redis提供了很多种功能或模式,可以运用在不同的场景下,今天记录下redis中的发布、订阅模式的基本使用

  注redis安装及主从搭建请参考我其他博文http://www.cnblogs.com/longjee/p/8652374.html,本文不再赘述

  • redis中的发布订阅由三部分组成。发布者(生产者)、通道(类似于topic)、订阅者(消费者),具体结构如下图:

               

 

  • redis中实现发布订阅
  1. 首先我们打开两个客户端 A、B
  2. A客户端使用subscribe 命令订阅通道test
  3. 然后客户端B使用publish 命令发送消息
  4. 这个时候客户端A能自动接收到消息
  5. 至此,使用redis简单的搭建一个发布订阅服务就完成了。
  • 使用Java基于redis实现发布订阅
  1. 首先我们新建一个maven的项目。然后建立三个属于该项目的module: redis-pub、redis-sub、redis-common
  2. 在redis-pubsub(下面简称父项目)的pom中添加jedis的依赖 ,本人使用2.9.0版本
  3. redis-common是我写的一个公共组件
  4. 下面开始写sub端(贴出部分为核心代码)
  5.  1 package com.star4j.redissub.client;
     2 
     3 import com.star4j.rediscommon.helper.JedisConnectionHelper;
     4 import redis.clients.jedis.Jedis;
     5 import redis.clients.jedis.JedisPubSub;
     6 
     7 /**
     8  * @Author: WuYL
     9  * @Description: 实现订阅功能
    10  * @Date: Create in 2018/3/29 15:21
    11  * @Modified By:
    12  */
    13 public abstract class SubClient extends JedisPubSub{
    14 
    15     private Jedis jedis = null;
    16 
    17     public SubClient(Jedis jedis){
    18         this.jedis = jedis;
    19     }
    20 
    21     protected SubClient(){
    22         jedis = JedisConnectionHelper.get();
    23     }
    24 
    25     /**
    26      * 订阅一个通道 (必须实现该类才行)
    27      * @param channal
    28      */
    29     public final void sub(String channal){
    30         jedis.subscribe(this, channal);
    31     }
    32 
    33     /**
    34      * 有消息被推送过来时调用(子类实现)
    35      * @param channel
    36      * @param message
    37      */
    38     public abstract void message(String channel, String message);
    39 
    40     @Override
    41     public  void onMessage(String channel, String message) {
    42         this.message(channel, message);
    43     }
    44 
    45 }
    View Code

     

  6. pub端代码(部分代码)
  7.  1 package com.star4j.redispub.client;
     2 
     3 import com.star4j.rediscommon.helper.JedisConnectionHelper;
     4 import redis.clients.jedis.Jedis;
     5 
     6 /**
     7  * @Author: WuYL
     8  * @Description: 发布端实现
     9  * @Date: Create in 2018/3/29 15:41
    10  * @Modified By:
    11  */
    12 public class PubClient {
    13 
    14     /**
    15      * 发布消息
    16      * @param channel
    17      * @param message
    18      */
    19     public static void pub(String channel, String message){
    20         Jedis jedis = JedisConnectionHelper.get();
    21         jedis.publish(channel, message);
    22         JedisConnectionHelper.close(jedis);
    23     }
    24 }
    View Code

     

  8. 测试:使用postman进行测试。结果如下。

至此,使用Java搭建一个简单的发布订阅模式已经完成!

如有什么不对之处,敬请指教。

上面为关键部分代码,完整代码请到我的github:https://github.com/wylsource/redis-pubsub

posted @ 2018-03-29 17:51  longjee  阅读(4979)  评论(0编辑  收藏  举报