消息隊列
所謂的"消息隊列"就是:在消息的傳輸過程中保存消息的容器。上次有朋友面試,面試官就問,redis可以用作消息隊列嗎?當時一懵。每當想到消息隊列:我們都會想到RabbitMQ,ActiveMQ,RocketMQ,等等一些專業的消息中間件。但是如果我們做的事情比較簡單業務邏輯不是很復雜,只需要有一個消息隊列,使用專業的消息中間件是非常麻煩的,因此我們可以使用Redis做消息隊列。
如果對消息的可靠性沒有較高的要求的話,那么就可以使用Redis去實現。
Redis做消息隊列,可以使用List這個數據類型。List里面有兩個命令,lpush/rpush操作來實現入隊,然后使用lpop/rpop實現出列。
在客戶端中,我們會維護一個死循環來不停的從隊列中pop讀取數據,如果隊列中有消息,則直接讀取,如果沒有,就會陷入死循環,直到下一次有消息進入。這種死循環會造成大量的資源浪費,這個時候我們可以使用,blpop/brpop去處理,相當於lpop的阻塞,當沒有消息到來的時候就會休眠,直到消息來臨,才喚醒,pop去讀取數據。在java中可以使用while循環去實現。
延遲消息隊列
延遲消息隊列,可以用zset實現,里面有score分數浮動數值,數據 可以根據core排序,zset可用於高效的檢索,我們可以將時間作為score,將value存到redis中,然后通過輪詢的方式去讀取消息出來,在當前時間的基礎上在加5s,就可以實現延遲消息隊列。
首先,如果消息是字符串,直接發送就可以,如果是對象,則需要序列化,實現序列化接口或者使用JSON進行序列化和反序列化。
步驟一:構造一個消息對象。
步驟二:封裝消息隊列,包括消息入隊,和消息出列
步驟三:測試,構造消息隊列,構造一個消息生產者,構造一個消息消費者。