虽然有消息队列,我们还是要了解一下redis发布订阅模式哟!!!!!
具体的命令使用方式 可以使用 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"
定义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");
}