溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis可以用來做什么

發(fā)布時間:2020-10-19 17:34:15 來源:億速云 閱讀:150 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章將為大家詳細講解有關(guān)redis可以用來做什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

 Redis不僅可作為緩存服務器,還可用作消息隊列。它的列表類型天生支持用作消息隊列。

由于Redis的列表是使用雙向鏈表實現(xiàn)的,保存了頭尾節(jié)點,所以在列表頭尾兩邊插取元素都是非??斓?。

所以可以直接使用Redis的List實現(xiàn)消息隊列,只需簡單的兩個指令lpush和rpop或者rpush和lpop。

但是會有消息消費者有一個問題存在,即需要不停的調(diào)用rpop方法查看List中是否有待處理消息。每調(diào)用一次都會發(fā)起一次連接,這會造成不必要的浪費。也許你會使用Thread.sleep()等方法讓消費者線程隔一段時間再消費,但這樣做有兩個問題:

1)、如果生產(chǎn)者速度大于消費者消費速度,消息隊列長度會一直增大,時間久了會占用大量內(nèi)存空間。

2)、如果睡眠時間過長,這樣不能處理一些時效性的消息,睡眠時間過短,也會在連接上造成比較大的開銷。

所以可以使用brpop指令,這個指令只有在有元素時才返回,沒有則會阻塞直到超時返回null,然后可以運行Customer,清空控制臺,可以看到程序沒有任何輸出,阻塞在了brpop這兒。然后在打開Redis的客戶端,輸入指令client list,可以查看當前有兩個連接。

Redis除了對消息隊列提供支持外,還提供了一組命令用于支持發(fā)布/訂閱模式。

1)發(fā)布

PUBLISH指令可用于發(fā)布一條消息,格式 PUBLISH channel message

返回值表示訂閱了該消息的數(shù)量。

2)訂閱

SUBSCRIBE指令用于接收一條消息,格式 SUBSCRIBE channel

可以看到使用SUBSCRIBE指令后進入了訂閱模式,但沒有接收到publish發(fā)送的消息,這是因為只有在消息發(fā)出去前訂閱才會接收到。在這個模式下其他指令,只能看到回復。

回復分為三種類型:

1、如果為subscribe,第二個值表示訂閱的頻道,第三個值表示是第幾個訂閱的頻道?(理解成序號?)

2、如果為message(消息),第二個值為產(chǎn)生該消息的頻道,第三個值為消息

3、如果為unsubscribe,第二個值表示取消訂閱的頻道,第三個值表示當前客戶端的訂閱數(shù)量。

可以使用指令UNSUBSCRIBE退訂,如果不加參數(shù),則會退訂所有由SUBSCRIBE指令訂閱的頻道。

Redis還支持基于通配符的消息訂閱,使用指令PSUBSCRIBE (pattern subscribe)。

可以看到publish指令返回的是2,而訂閱端這邊接收了兩次消息。這是因為PSUBSCRIBE指令可以重復訂閱頻道。而使用PSUBSCRIBE指令訂閱的頻道也要使用指令PUNSUBSCRIBE指令退訂,該指令無法退訂SUBSCRIBE訂閱的頻道,同理UNSUBSCRIBE也不能退訂PSUBSCRIBE指令訂閱的頻道。同時PUNSUBSCRIBE指令通配符不會展開。

總結(jié):

使用Redis的List數(shù)據(jù)結(jié)構(gòu)可以簡單迅速地做一個消息隊列,同時Redis提供的BRPOP和BLPOP等指令解決了頻繁調(diào)用Jedis的rpop和lpop方法造成的資源浪費問題。除此之外,Redis提供對發(fā)布/訂閱模式的指令,可以實現(xiàn)消息傳遞、進程間通信。

關(guān)于redis可以用來做什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI