1. 程式人生 > 其它 >Java實現基於Redis的釋出/訂閱

Java實現基於Redis的釋出/訂閱

技術標籤: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

這時檢視專案的控制檯,發現輸出日誌如下,即呼叫成功

在這裡插入圖片描述

碼字不易,如果文章幫助了你,點個贊吧~