什么是 Redis
Redis 是一個開源的使用 ANSI C語言編寫的內存數據庫,它以 key-value 鍵值對的形式存儲數據,高性能,讀取速度快,也提供了持久化存儲機制。
Redis 通常在項目中用的最多的功能是緩存,然而今天靚仔將為你介紹它的另一個功能,輕量級的消息隊列。
Redis 發布訂閱
機制
Redis 提供了發布訂閱功能,可以用於消息的傳輸,Redis 的發布訂閱機制包括三個部分,發布者,訂閱者和 Channel(稱之為頻道或主題)。
發布者將消息發布到指定頻道,訂閱該頻道的訂閱者就能夠接受到這條消息,如果有多個訂閱者,那么他們會接受到相同的消息。
功能實現
發布消息
Redis 采用 PUBLISH 命令發送消息,其返回值為接收到該消息的訂閱者的數量。
訂閱頻道
Redis 采用 SUBSCRIBE 命令訂閱某個頻道,其返回值包括客戶端訂閱的頻道,目前已訂閱的頻道數量,以及接收到的消息,其中subscribe表示已經成功訂閱了某個頻道。
模式匹配
模式匹配功能允許客戶端訂閱符合某個模式的頻道,Redis采用PSUBSCRIBE訂閱符合某個模式所有頻道,用“ * ”表示模式,“ * ”可以被任意值代替。
假設客戶端同時訂閱了某種模式和符合該模式的某個頻道,那么發送給這個頻道的消息將被客戶端接收到兩次,只不過這兩條消息的類型不同,一個是 message 類型,一個是 pmessage 類型,但其內容相同。
取消訂閱
Redi s采用 UNSUBSCRIBE 和 PUNSUBSCRIBE 命令取消訂閱,其返回值與訂閱類似。由於Redis的訂閱操作是阻塞式的,因此一旦客戶端訂閱了某個頻道或模式,就將會一直處於訂閱狀態直到退出。在 SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE 和 PUNSUBSCRIBE 命令中,其返回值都包含了該客戶端當前訂閱的頻道和模式的數量,當這個數量變為0時,該客戶端會自動退出訂閱狀態。
SpringBoot+Redis 實現發布訂閱
springboot 如何整合 redis 我這里就不講了,相信對你來說也沒有一點問題。我們直接上代碼
消息監聽配置
@Configuration
public class RedisSubConfig {
public static final String SUB_KEY = "chat";//頻道channel
/**
* redis消息監聽器容器
* 可以添加多個監聽不同話題的redis監聽器,只需要把消息監聽器和相應的消息訂閱處理器綁定,該消息監聽器
* 通過反射技術調用消息訂閱處理器的相關方法進行一些業務處理
* @param connectionFactory
* @param listenerAdapter
* @return
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//訂閱了一個頻道
container.addMessageListener(listenerAdapter, new PatternTopic(RedisSubConfig.SUB_KEY));
return container;
}
/**
* 消息監聽器適配器,綁定消息處理器,利用反射技術調用消息處理器的業務方法
* @param receiver
* @return
*/
@Bean
MessageListenerAdapter listenerAdapter(RedisReceiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
/**
* redis 讀取內容的template
* @param connectionFactory
* @return
*/
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}
接收消息
@Service
public class RedisReceiver {
public void receiveMessage(String message) {
System.out.println("接收消息:" + message);
}
}
采用定時器發布消息
@EnableScheduling //開啟定時器功能
@Component
public class MessageSender {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Scheduled(fixedRate = 5000) //間隔5s 通過StringRedisTemplate對象向redis消息隊列chat頻道發布消息
public void sendMessage(){
stringRedisTemplate.convertAndSend("chat", "hello "+ new Date());
}
}
運行結果
對比RabbitMQ發布訂閱模式
- Redis:輕量級,低延遲,高並發,低可靠性;
- RabbitMQ:重量級,高可靠,異步,不保證實時;
- RabbitMQ是一個專門的 AMQP 協議隊列,他的優勢就在於提供可靠的隊列服務,並且可做到異步,而Redis主要是用於緩存的,Redis 的發布訂閱模式,可用於實現及時性,且可靠性低的功能。
往期推薦
▼更多精彩推薦,請關注靚仔▼