詳解 Redis 中的 Strea
Redis 官方提供了多種數據類型,除了常見的 String、Hash、List、Set、zSet 之外,還包括 Stream、Geospatial、Bitmaps 等一系列的數據類型,如下所示的常見的一些數據類型整理:
這些數據類型在 Redis 中發揮着各自獨特的作用,今天我們來聊一下 Redis 的 Stream 數據類型。
1、認識 Stream 數據類型
Redis 的 Stream 是 Redis5.0 引入的一種新的數據類型,用於處理消息流(Message Stream)。Stream 數據類型提供了輕量級的、可擴展的消息發佈與訂閱模型,適用於實時消息傳遞和事件處理,如下是 Streams 數據類型的結構圖:
(1)消息(Message)
一條消息是 Stream 中的一個元素,每條消息都有一個或多個 key-value 的鍵值對組成,如下圖所示的消息:
每條消息都有自己的唯一的 ID(如 ID_1=123),這個 ID 可以由 Redis 自動生成也可以是用戶自定義。
一個 Stream 是由多個消息組成的有序集合,每個 Stream 都有唯一的名稱,它就是 Redis 的 key。
(2)Consumer Group(消費者組)
消費者組是一組消費者的集合,並且擁有唯一的組名,消費者組允許多個消費者組成一個組來共同消費同一個 Stream 中的消息,如下所示的消費者組:
每個消費者組都有自己的 last_delivered_id 遊標,該遊標用於跟蹤該組已經讀取過的最新消息。每當消費者讀取消息時,遊標會自動更新。同時由於在消費者組內的成員之間存在消費競爭問題(一條消息只會被其中一個消費者),遊標可以避免重複消費的問題。
pending_ids 是用來記錄那些已經被消費者讀取但尚未確認 (ack) 的消息 ID,如下如所示:
如上圖所示的 pending_ids 列出了當前正等待消費者確認處理的消息,如 consumer1 正在消費 ID_3 中的數據,但是還沒有確認消費完成,此時將這個 ID_3 消息的 id 存放在 pending_ids 中。
在一個 Stream 隊列中可以存在多個消費組,每個消費組內部又有多個消費者。這些消費者在同一組內形成競爭關係,如果某條消息被組內的一個消費者處理,那麼其他消費者就不會再處理這條消息。
已消費但未確認的消息 ID 會被加入到 pending_ids 列表中,隨着消息被確認處理,消費組的遊標將相應地向前移動,消費者們則繼續爭奪下一條消息進行處理。
2、Stream 中的命令
(1)XADD 發佈消息到 Stream
XADD my_stream * id 1001 height 60.5
XADD my_stream * id 1002 height 70.2
創建名爲 my_stream 的 Stream,使用 * 表示使用自動生成的唯一 ID。向 Stream 中發佈了 2 條消息,每條消息包含 id 和 height 字段。
(2)XREAD 訂閱消息
XREAD BLOCK 0 STREAMS my_stream 0
使用 XREAD 命令訂閱 my_stream,BLOCK 0 表示一直阻塞等待新消息;如果有新消息,將會返回消息的信息。
(3)XRANGE 獲取消息範圍
XRANGE my_stream - +
使用 XRANGE 命令獲取 my_stream 中的所有消息。- 表示最小的 ID,+ 表示最大的 ID,並且返回消息的 ID 和字段信息。
(4)XLEN 獲取 Stream 中消息數量
XLEN my_stream
使用 XLEN 命令獲取 my_stream 中的消息數量。操作 Stream 還有一些其他的命令,有興趣的朋友自己去學習一下。
3、Stream 應用場景
Redis Streams 是一種強大的數據結構,適用於處理實時消息流和事件的場景,以下是一些 Redis Streams 的常見應用場景。
(1)消息隊列
Redis Streams 可以作爲一個輕量級的消息隊列系統,支持發佈 / 訂閱、消費者組等特性,它適用於一些簡單的異步任務處理場景中。生產者向 Stream 推送消息,然後消費者從 Stream 中拉取消息進行處理(消費者組實現消息的負載均衡和並行消費)。
常見的使用場景如實時的日誌處理(使用 Redis Streams 來存儲和處理實時產生的日誌數據);通知和實時推送(將通知消息推送到 Redis Streams 中,以便實現實時通知和推送功能)。
(2)事件流處理
Redis Stream 可以作爲事件流系統的一部分,幫助處理實時數據流,它允許將事件以時間順序存儲,並可以方便地讀取和處理。常見的使用場景如實時監控(採集和處理系統運行時的各類日誌數據),流式數據分析(實時分析數據流,如金融市場、傳感器數據等)。
(3)分佈式任務隊列
使用 Redis Stream 可以實現一個高效的分佈式任務隊列系統。多個工作節點 (消費者) 可以並行消費任務,任務的消費進度由 Redis 管理,確保每個任務被準確地消費一次。
總結:
(1)Redis Streams 是一個強大的工具,適用於實時數據流處理、消息隊列、事件流和日誌收集等場景。
(2)Redis Stream 具有性能高、可靠性強、靈活性高以及易於集成。但是 Redis Stream 在數據量非常大的情況下會佔用大量的內存,同時它也缺乏強大的持久化保證(雖然 Redis 提供了 AOF 和 RDB 持久化,但 Redis 主要是一個內存數據庫,無法像傳統消息隊列系統 (如 RocketMQ、Kafka) 那樣提供強大的持久化機制)。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/FaqCe60zKh498FGqhm2yQA