Redis命令詳解:Streams

Redis5.0迎來了一種新的數據結構Streams,沒有了解過的同學可以先閱讀前文,今天來介紹一下Streams相關的命令。

XACK

最早可用版本:5.0.0

時間複雜度:O(1)

用法:XACK key group ID [ID…]

這個命令用於刪除消費者組的pending entries list中的元素。通常情況下,調用XREADGROUP命令或者消費者調用XCLAIM命令時,會使一個消息阻塞,並存到PEL中,阻塞的消息被髮送給消費者時,服務器並不知道消息是否被處理。

當消費者成功消費消息後,會調用XACK命令,服務器就會將消息從PEL中刪除,並釋放內存。

XADD

最早可用版本:5.0.0

時間複雜度:O(1)

向指定的stream添加元素。如果key不存在,就創建一個新的stream。

entry由一系列field-value對組成,存儲順序由用戶添加順序決定。XADD命令是唯一一個向stream中添加數據的命令。刪除數據的命令則有XDEL和XTRIM。

在stream中,entry ID是唯一標識。XADD命令中ID參數是*時,會自動生成唯一ID。然而在生產環境中並不常用,通常需要我們指定一種格式較好的唯一ID。

默認的ID生成策略是:“Unix毫秒時間戳-同一毫秒值內的序列號”。

當用戶顯式指定ID時,最小值是0-1,且ID必須是遞增的。

用戶可以使用MAXLEN指定stream的最大元素數量

1XADD mystream MAXLEN ~ 1000 * ... entry fields here ..

上面的波浪線表示不是嚴格的限制1000個,也可以多出幾十個。

XCLAIM

最早可用版本:5.0.0

時間複雜度:O(log N)

用法:XCLAIM key group consumer min-idle-time ID [ID …][IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count][FORCE] [JUSTID]

這個命令用於改變pending消息的所有權,新的owner是命令參數中的consumer。

命令的使用場景是:

  1. 一個消費者關聯了一個stream

  2. 消費者A通過XREADGROUP讀取一條消息

  3. 這個消息被加入到PEL中,併發送給指定的消費者,但是沒有調用XACK命令來確認

  4. 這時消費者突然掛掉

  5. 其他的消費者就會使用XPENDING命令檢查待處理消息列表,爲了繼續處理這些命令,它們使用XCLAIM命令改變這些消息的所有者。

接下來解釋一下命令的各個選項:

  1. IDLE

    :設置消息空閒時間,默認是0。消息只有在空閒時間大於IDLE時纔會被認領。
  2. TIME

    :和IDLE相同,不過它是絕對時間
  3. RETRYCOUNT

    :設置重試次數,通常XCLAIM不會改變這個值,它通常用於XPENDING命令,用來發現一些長時間未被處理的消息。
  4. FORCE:在PEL中創建待處理消息,即使指定的ID尚未分配給客戶端的PEL。

  5. JUSTID:只返回認領的消息ID數組,不返回實際消息。

XDEL

最早可用版本:5.0.0

時間複雜度:O(1)

刪除stream中的entry並返回刪除的數量。

XGROUP

最早可用版本:5.0.0

時間複雜度:每個子命令是O(1)

該命令用於管理stream相關的消費者組。使用XGROUP命令你可以:

  • 創建與一個stream相關聯的消費者組

  • 銷燬一個消費者組

  • 從消費者組中刪除指定的消費者

  • 設置消費者組的last delivered ID

創建新的消費者組的命令是:

1XGROUP CREATE mystream consumer-group-name $

最後一個參數是stream中已傳遞的最後一個ID,使用$表示這個消費者組只能獲取到新的元素。

銷燬消費者組的命令是:

1XGROUP DESTROY mystream some-consumer-group

即使消費者組存在活躍的消費者和等待消息,它仍然會被刪除,所以執行這個命令需要格外謹慎。

刪除指定消費者的命令是:

1XGROUP DELCONSUMER mystream consumer-group-name myconsumer123

當一個新的consumer的名字被提到時,就會自動創建消費者。當消費者不再使用時,我們可以將它刪除,上面的命令返回消費者在被刪除之前所擁有的待處理消息。

設置last delivered ID的命令是:

1XGROUP SETID mystream my-consumer-group 0

最後,如果不記得語法,可以使用命令:

1XGROUP HELP

XINFO

最早可用版本:5.0.0

時間複雜度:O(N),N是CONSUMERS和GROUPS返回的item數量

用法:XINFO [CONSUMERS key groupname] [GROUPS key][STREAM key] [HELP]

這個命令用於返回stream和相關消費者組的不同信息。它有三種形式。

  • XINFO STREAM

    這個命令返回stream的通用信息
  • XINFO GROUPS

    這個命令用於獲得stream相關的消費者組的信息
  • XINFO CONSUMERS

    這個命令返回指定消費者組的消費者列表

XLEN

最早可用版本:5.0.0

時間複雜度:O(1)

返回stream中的entry數量。如果key不存在,則返回0。對於長度爲0的stream,Redis不會刪除,因爲可能存在關聯的消費者組。

XPENDING

最早可用版本:5.0.0

時間複雜度:O(N),N是返回的元素數量

用法:XPENDING key group [start end count] [consumer]

通過消費者組捕獲數據,但不是確認這些數據。

XPENDING命令是檢查待處理消息列表的接口,用於觀察和了解消費者組正在發生的事情:哪些客戶端是活躍的,哪些消息等待消費,或者查看是否有空閒的消息。這個命令通常與XCLAIM一起使用,用於處理長時間未被處理的消息。

這個命令的返回值是:

1> XPENDING mystream group55 - + 10
21) 1) 1526984818136-0
3   2) "consumer-123"
4   3) (integer) 196415
5   4) (integer) 1

其中包括:

  1. 消息ID

  2. 獲取並要確認消息的消費者名稱

  3. 自上次消息傳遞給消費者以來經過的毫秒數

  4. 該消息被傳遞的次數

XRANGE

最早可用版本:5.0.0

時間複雜度:O(N),N是返回的元素數量

用法:XRANGE key start end [COUNT count]

該命令用於返回stream中指定ID範圍的數據,可以使用-和+表示最小和最大ID。ID也可以指定爲不完全ID,即只指定Unix時間戳,就可以獲取指定時間範圍內的數據。

XREAD

最早可用版本:5.0.0

時間複雜度:O(N),N是返回的元素數量

用法:XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key …] ID [ID …]

從一個或多個stream中讀取數據,僅返回ID大於調用者報告的最後接收ID的條目。

BLOCK項用於指定阻塞時長。STREAMS項必須在最後,用於指定stream和ID。

XREADGROUP

最早可用版本:5.0.0

時間複雜度:O(log(N)+M) ,N是返回的元素數量,M是一個常量。

用法:XREADGROUPGROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key …] ID [ID …]

XREADGROUP是XREAD的特殊版本,支持消費者組。

XREVRANGE

最早可用版本:5.0.0

時間複雜度:O(log(N)+M) ,N是返回的元素數量,M是一個常量。

此命令與XRANGE唯一的區別是順序相反。

XTRIM

最早可用版本:5.0.0

時間複雜度:O(log(N)+M) ,N是返回的元素數量,M是一個常量。

用法:XTRIM key MAXLEN [~] count

該命令用於裁剪流爲指定數量的項目。這個命令被設計爲接受多種策略,但目前只實現了MAXLEN一種。

如果要裁剪到stream中最新的1000個項目:

1XTRIM mystream MAXLEN 1000

可以使用以下形式提高效率:

1XTRIM mystream MAXLEN ~ 1000

~表示用戶不需要精確的1000個項目,可以多出幾十個,但是不能少於1000.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章