本文使用REDIS列表進行排隊和pub/sub。儘管列表使用LPUSH/RPOP有效地實現了FIFO/LIFO隊列,但與Redis的本機機制相比,它們對酒吧/sub的效率低下。本文還討論了性能
REDIS列表提供了一種直接實現排隊和發布/訂閱(PUB/SUB)系統的簡單方法,儘管它們更適合排隊。讓我們分解每個用例:
排隊: REDIS列表使用LPUSH
(左推)和RPOP
(右POP)命令來實現首先出局(FIFO)隊列。 LPUSH
將元素添加到列表的頭部,而RPOP
刪除並返回尾部的元素。這會創建一個經典的隊列,其中按添加的順序處理項目。對於最後一in的首次輸出(LIFO)堆棧,您將使用RPUSH
(右推)和LPOP
(左POP)。
示例(FIFO隊列):
想像一個任務隊列。工人從名為“任務”的列表中消費任務:
LPUSH tasks "task1"
將任務添加到隊列中。BRPOP tasks 0
(阻止POP)等待任務。 BRPOP
塊,直到可以使用任務或達到超時(0表示無限等待)。一旦可用任務,就將其刪除並處理。 Pub/sub:雖然REDIS列表可以適用於Pub/Sub,但這不是其主要優勢。 Redis使用PUBLISH
和SUBSCRIBE
命令的內置酒吧/子機制更有效,專門為此目的而設計。使用酒吧/sub的列表將涉及將消息推向列表,並讓訂閱者反復對新消息的列表進行輪詢,這是效率低下的,與本機酒吧/sub相比,訂閱效率低下。因此,對於Pub/sub,使用Redis的本機酒吧/子功能。
Redis提供了幾種適合排隊的數據結構,每個數據結構都具有性能權衡:
BRPOP
可以在繁重的爭論中成為瓶頸,許多消費者等待任務。內存使用情況與隊列大小線性縮放。總而言之:列表適用於簡單的低頻率隊列。對於高通量,可靠和可擴展的隊列,Redis流是首選的選擇。當任務優先級至關重要時,排序集是理想的。
僅使用REDIS列表實施真正可靠的消息隊列是具有挑戰性的。 REDIS列表本身沒有提供服務器內存以外的消息持久性之類的功能。為了提高可靠性,請考慮以下策略:
LPUSH
和RPOP
操作在交易( MULTI
, EXEC
)中以確保原子性。在發生故障的情況下,這可以防止部分操作。這些技術可提高可靠性,但在極端情況下不會消除數據丟失的可能性。對於關鍵任務應用程序,建議使用更強大的消息隊列系統(例如,Kafka,RabbitMQ)。
如前所述,REDIS列表不是酒吧/子的理想選擇。但是,如果您必須使用它們,請遵循這些做法(請記住,這些方法是解決方法,效率較低,效率較低):
LRANGE
持續少量超時對列表進行輪詢,這是高效效率的。它浪費了資源並增加了延遲。BLPOP
或BRPOP
:阻止POP(左POP的BLPOP
,右POP的BRPOP
)比投票更有效。他們只有在有消息可用時消耗資源。至關重要的是,請記住,Redis的天然酒吧/子系統對於酒吧/子方案而言要出色。這些“最佳實踐”僅僅是用於使用不為任務設計的工具的緩解策略。使用REDIS列表進行排隊,並使用Redis的內置酒吧/子進行發布/訂閱操作,以實現最佳性能和可伸縮性。
以上是如何使用REDIS列表進行排隊和酒吧/sub?的詳細內容。更多資訊請關注PHP中文網其他相關文章!