您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關redis可以用來做什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Redis不僅可作為緩存服務器,還可用作消息隊列。它的列表類型天生支持用作消息隊列。
由于Redis的列表是使用雙向鏈表實現的,保存了頭尾節點,所以在列表頭尾兩邊插取元素都是非常快的。
所以可以直接使用Redis的List實現消息隊列,只需簡單的兩個指令lpush和rpop或者rpush和lpop。
但是會有消息消費者有一個問題存在,即需要不停的調用rpop方法查看List中是否有待處理消息。每調用一次都會發起一次連接,這會造成不必要的浪費。也許你會使用Thread.sleep()等方法讓消費者線程隔一段時間再消費,但這樣做有兩個問題:
1)、如果生產者速度大于消費者消費速度,消息隊列長度會一直增大,時間久了會占用大量內存空間。
2)、如果睡眠時間過長,這樣不能處理一些時效性的消息,睡眠時間過短,也會在連接上造成比較大的開銷。
所以可以使用brpop指令,這個指令只有在有元素時才返回,沒有則會阻塞直到超時返回null,然后可以運行Customer,清空控制臺,可以看到程序沒有任何輸出,阻塞在了brpop這兒。然后在打開Redis的客戶端,輸入指令client list,可以查看當前有兩個連接。
Redis除了對消息隊列提供支持外,還提供了一組命令用于支持發布/訂閱模式。
1)發布
PUBLISH指令可用于發布一條消息,格式 PUBLISH channel message
返回值表示訂閱了該消息的數量。
2)訂閱
SUBSCRIBE指令用于接收一條消息,格式 SUBSCRIBE channel
可以看到使用SUBSCRIBE指令后進入了訂閱模式,但沒有接收到publish發送的消息,這是因為只有在消息發出去前訂閱才會接收到。在這個模式下其他指令,只能看到回復。
回復分為三種類型:
1、如果為subscribe,第二個值表示訂閱的頻道,第三個值表示是第幾個訂閱的頻道?(理解成序號?)
2、如果為message(消息),第二個值為產生該消息的頻道,第三個值為消息
3、如果為unsubscribe,第二個值表示取消訂閱的頻道,第三個值表示當前客戶端的訂閱數量。
可以使用指令UNSUBSCRIBE退訂,如果不加參數,則會退訂所有由SUBSCRIBE指令訂閱的頻道。
Redis還支持基于通配符的消息訂閱,使用指令PSUBSCRIBE (pattern subscribe)。
可以看到publish指令返回的是2,而訂閱端這邊接收了兩次消息。這是因為PSUBSCRIBE指令可以重復訂閱頻道。而使用PSUBSCRIBE指令訂閱的頻道也要使用指令PUNSUBSCRIBE指令退訂,該指令無法退訂SUBSCRIBE訂閱的頻道,同理UNSUBSCRIBE也不能退訂PSUBSCRIBE指令訂閱的頻道。同時PUNSUBSCRIBE指令通配符不會展開。
總結:
使用Redis的List數據結構可以簡單迅速地做一個消息隊列,同時Redis提供的BRPOP和BLPOP等指令解決了頻繁調用Jedis的rpop和lpop方法造成的資源浪費問題。除此之外,Redis提供對發布/訂閱模式的指令,可以實現消息傳遞、進程間通信。
關于redis可以用來做什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。