redis发布(pub)、订阅(sub)模式
前言:redis提供了很多种功能或模式,可以运用在不同的场景下,今天记录下redis中的发布、订阅模式的基本使用
注redis安装及主从搭建请参考我其他博文http://www.cnblogs.com/longjee/p/8652374.html,本文不再赘述
- redis中的发布订阅由三部分组成。发布者(生产者)、通道(类似于topic)、订阅者(消费者),具体结构如下图:
- redis中实现发布订阅
- 首先我们打开两个客户端 A、B
- A客户端使用subscribe 命令订阅通道test
- 然后客户端B使用publish 命令发送消息
- 这个时候客户端A能自动接收到消息
- 至此,使用redis简单的搭建一个发布订阅服务就完成了。
- 使用Java基于redis实现发布订阅
- 首先我们新建一个maven的项目。然后建立三个属于该项目的module: redis-pub、redis-sub、redis-common
- 在redis-pubsub(下面简称父项目)的pom中添加jedis的依赖 ,本人使用2.9.0版本
- redis-common是我写的一个公共组件
- 下面开始写sub端(贴出部分为核心代码)
-
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 }
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 }