redis的发布订阅是什么?
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。
java通过jedis实现的简单示例:
1、首先导入maven依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
2、新建JedisSubscribeMessage类处理订阅消息
在成功订阅通道或者接收到发布消息时会调用这些方法
import lombok.extern.slf4j.Slf4j;
import redis.clients.jedis.JedisPubSub;
/**
* 订阅者消息处理器
*/
@Slf4j
public class JedisSubscribeMessage extends JedisPubSub {
public JedisSubscribeMessage(){}
@Override
public void onMessage(String channel,String message){
log.info("成功收到redis发布的消息,channel:-->{},message:-->{}",channel,message);
}
@Override
public void onSubscribe(String channel,int subscribedChannels){
log.info("成功订阅redis通道,channel:-->{},subscribedChannels:-->{}",channel,subscribedChannels);
}
}
3、新建JedisPublishMessage类封装发布消息和订阅通道
import lombok.extern.slf4j.Slf4j;
import redis.clients.jedis.JedisCluster;
/**
* jedis发布消息与订阅通道
*/
@Slf4j
public class JedisPublishMessage {
/**
* 发布消息
*/
public static void publishMessage(JedisCluster jedisCluster,String key,String message){
if (message==null){
return;
}
new Thread(){
@Override
public void run(){
try {
jedisCluster.publish(key,message);
log.info("publish done!");
}catch (Exception e){
log.error("publish fail : "+e.getMessage());
}
}
}.start();
}
/**
* 订阅通道
* @param jedisCluster
*/
public static void subscribeChannel(JedisCluster jedisCluster,String channel){
new Thread(){
@Override
public void run(){
jedisCluster.subscribe(new JedisSubscribeMessage(),channel);
}
}.start();
}
}
4、写一个controller测试一下。
@RestController
public class TestReadsmsController {
@Autowired
private JedisCluster jedisCluster;
@GetMapping("/publish")
public void testPublish(String channel,String message){
JedisPublishMessage.publishMessage(jedisCluster,channel,message);
}
@GetMapping("/subscribe")
public void testSubscribe(String channel){
JedisPublishMessage.subscribeChannel(jedisCluster,channel);
}
}
5、测试结果:
(1)订阅通道
(2)发布消息