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。
命令的使用場景是:
一個消費者關聯了一個stream
消費者A通過XREADGROUP讀取一條消息
這個消息被加入到PEL中,併發送給指定的消費者,但是沒有調用XACK命令來確認
這時消費者突然掛掉
其他的消費者就會使用XPENDING命令檢查待處理消息列表,爲了繼續處理這些命令,它們使用XCLAIM命令改變這些消息的所有者。
接下來解釋一下命令的各個選項:
IDLE
:設置消息空閒時間,默認是0。消息只有在空閒時間大於IDLE時纔會被認領。TIME
:和IDLE相同,不過它是絕對時間RETRYCOUNT
:設置重試次數,通常XCLAIM不會改變這個值,它通常用於XPENDING命令,用來發現一些長時間未被處理的消息。FORCE:在PEL中創建待處理消息,即使指定的ID尚未分配給客戶端的PEL。
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
其中包括:
消息ID
獲取並要確認消息的消費者名稱
自上次消息傳遞給消費者以來經過的毫秒數
該消息被傳遞的次數
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.