1、或者用jdk的阻塞隊列linkedblockingqueue
我用過這個阻塞隊列解決過流水號串號問題
和消息隊列差不多
2、Redis提供了簡單的發佈訂閱功能,雖然不能和專業的消息中間件比,但如果我們只是簡單的想要使用發佈訂閱功能,那麼Redis中的發佈訂閱更合適不過了,因爲它和專業的消息中間比使用時相對比較簡單。
在Redis中消息的發佈者和訂閱者不能直接進行通信,而是通過頻道來實現的。消息的發佈者將消息發送到指定頻道中,而消息的訂閱者訂閱該頻道後,則會接受到該頻道中所有接收到的消息。
命令
- 發佈消息 publish channel message
publish kafka "this is a message"
publish命令的返回值爲該頻道的訂閱數,因爲該頻道沒有訂閱者,所以上圖中的代碼返回值爲0。
- 訂閱消息 subscribe channel [channel ...]
subscribe命令在執行成功後,命令行會阻塞,隨時等待着新的消息被髮送。如果此時我們在向該頻道中發送消息,則該訂閱會立即返回我們發送的消息。
下面我們瞭解一下訂閱命令的注意事項。
- 客戶端在執行訂閱命令後會進入訂閱狀態,只允許輸入subscribe、psubscribe、unsubscribe、punsubscribe這四個命令。
- 新開啓的訂閱客戶端是無法接受到之前頻道中消息的,因爲Redis不會對發佈的消息進行持久化。
- 取消訂閱
unsubscribe [channel [channel ...]]
查詢訂閱
- 查看活躍的頻道
pubsub channels
- 查看頻道訂閱數
pubsub numsub
- 查看模式訂閱數
pubsub numpat
上述內容就是Redis中發佈訂閱的全部內容,它和專業的消息中間件比例如Kafka、RocketMQ等。它不支持消息的堆積及回溯,如果我們在使用發佈訂閱功能時,如果可以容忍上述中的缺點,那我們Redis中的發佈訂閱功能可以優先考慮。