Java實現基於Redis的釋出/訂閱
阿新 • • 發佈:2021-02-20
技術標籤:Java開發經驗積累javaredisrabbitmq釋出訂閱
一、場景
使用Redis實現訊息的釋出訂閱,由生產者(pub)釋出訊息,消費者(sub)消費訊息。
這裡有個 channel 的概念,就是一個通道,消費者訂閱這個通道,然後釋出者在這個通道釋出訊息,訂閱這個通道的消費者都可以消費到。
二、命令
釋出訊息
# channel是指通道,message是指訊息的內容,按照這個格式,可以給該通道釋出訊息 PUBLISH channel message # 比如要往一個叫 demo的通道里發個訊息 helloworld PUBLISH demo helloworld
消費訊息
# channel 是指要訂閱的通道,這裡要和訊息釋出者的通道保持一致即可收到訊息
SUBSCRIBE channel
#比如我要訂閱上面建立的通道
SUBSCRIBE demo
三、Java實現
使用Java來實現的話,有下面步驟就可以簡單實現了,一個是配置RedisMessageListenerContainer 訊息監聽容器,然後配置訊息監聽介面卡MessageListenerAdapter,最後就是建立一個監聽的類,然後寫個方法來實現監聽回撥。
需要匯入的依賴
<dependency>
<groupId>org.springframework.boot</ groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
1、配置訊息監聽
/**
* @author linzp
* @version 1.0.0
* CreateDate 2021/1/29 9:06
*/
@Configuration
public class RedisConfig {
//這裡我寫在配置檔案裡了,可以自定義,只要和釋出訊息時定義的channel保持一致就可以
@Value("${redis.topic.test}" )
private String topic;
@Bean
public RedisMessageListenerContainer listenerContainer(RedisConnectionFactory factory,
MessageListenerAdapter messageListenerAdapter){
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(factory);
container.addMessageListener(messageListenerAdapter, new PatternTopic(topic));
return container;
}
@Bean
public MessageListenerAdapter messageListenerAdapter(RedisReceiver redisReceiver){
MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(redisReceiver,
"onMessage");
return messageListenerAdapter;
}
}
2、編寫訊息監聽時回撥的方法
/**
* @author linzp
* @version 1.0.0
* CreateDate 2021/1/29 9:10
*/
@Component
@Slf4j
public class RedisReceiver implements MessageListener {
@Override
public void onMessage(Message message, byte[] bytes) {
System.out.println("進來了回撥方法!");
log.info("回撥的資訊 message={}", message);
log.info("回撥的資訊 bytes={}", bytes);
}
}
3、傳送訊息
/**
* @author linzp
* @version 1.0.0
* CreateDate 2021/1/29 9:20
*/
@Service
public class PublishService {
//這裡我使用stringRedisTemplate
@Autowired
private StringRedisTemplate stringRedisTemplate;
//這裡使用convertAndSend方法,引數為 channel 通道和內容
public void sendMsg(String channel, String msg){
stringRedisTemplate.convertAndSend(channel, msg);
}
}
四、測試
啟動專案,然後開啟本地的一個客戶端,釋出訊息
127.0.0.1:6379> PUBLISH SEND_MSG helloworld
(integer) 1
127.0.0.1:6379> ^C
這時檢視專案的控制檯,發現輸出日誌如下,即呼叫成功
碼字不易,如果文章幫助了你,點個贊吧~