关于java:redis发布订阅模式

35次阅读

共计 2040 个字符,预计需要花费 6 分钟才能阅读完成。

一 前言

尽管有音讯队列,咱们还是要理解一下 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 的音讯是不会长久化

求关注

正文完
 0