redis 流 stream的使用总结 - 基础命令
簡言
1.? ?流(stream)是redist5.0版本新增加的數據結構,也是該版本最重要的更新,專門用于實現消息隊列,事件系統
2.? ?redis之前的其他的數據結構實現消息隊列,各有缺點
2.1 列表(list)可以快速地將新消息追加到列表的尾部,但是不適合范圍查找
2.2 集合(set)有序集合(zset)雖然可以快速進行查找,但是缺少列表(list)和發布訂閱等數據結構提供的阻塞彈出原語
2.3 發布訂閱雖然可以將消息主動傳遞給多個客戶端,也擁有阻塞彈出的原語,但是其發送即忘(send and forget)的策略,會導致離線的客戶端丟失消息,這非常嚴重
3.? ?其他數據結構共同的缺點,即是所有的元素都只能是單個值,如果你想傳遞多項信息,必須使用序列化工具比如json,先序列化壓入,取出后再序列化才能使用
4.? ?流(stream)解決了上面提到的所有問題,每個元素可以包含任意多項信息,且每個元素都包含一個ID,這些元素會根據ID大小在流中有序排列
?
redis流stream使用系列文章
第一篇?redis 流 stream的使用總結 - 基礎命令
第二篇?redis 流 stream的使用總結 - 如何遍歷
第三篇?redis 流 stream的使用總結 - 消費者組
?
函數總結:
1. XADD 添加元素到末尾
2. XTRIM 對流進行修剪,限制長度
3. XDEL 移除指定元素
4. XLEN 獲取流包含的元素數量
5. XRANGE 順序訪問流中的元素,元素ID從小到大
6. XREVRANGE 逆序訪問流中的元素,元素ID從大到小
7. XREAD 以阻塞或非阻塞方式獲取流元素
下面的是消費者組相關的
8.1 XGROUP CREATE 創建消費者組
8.2 XREADGROUP GROUP 讀取消費者組中的消息
8.3 XACK?將消息標記為“已處理”
8.4 XGROUP SETID 為消費者組設置新的最后遞送消息ID
8.5 XGROUP DELCONSUMER 刪除消費者
8.6?XGROUP DESTROY 刪除消費者組
8.7 XPENDING 顯示待處理消息的相關信息
8.8 XCLAIM 轉移消息的歸屬權
8.9 XINFO 查看流和消費者組的相關信息;XINFO GROUPS 打印消費者組的信息; XINFO STREAM 打印流信息
具體用法及示例
1. XADD 添加元素到末尾
?? ?格式:XADD stream id field value [field value ...] 返回值是該元素的ID
? ? 例如:redis> XADD s1 1100000000000-12345 k1 v1 k2 v2
?? ? ? ? ?1100000000000-12345
?? ?若追加的元素ID不完整時,redis會自動補全,可能是檢測了分隔符‘-’吧
?? ?例如:redis> XADD temp-stream 1000000000000 k1 v1
?? ? ? ? ?1000000000000-0
?? ?注意事項:新元素的ID必須比流中所有已有元素的ID都要大,redis會進行檢測
?? ?若將符號 * 用于ID參數的值時,redis將會自動為新元素生成一個可用的新ID
?? ?規則如下:?? ?
? ? 如果當前毫秒之內還沒有元素,則用當前毫秒的時間戳,順序編號為0,例如1530000000000-0
? ? 如果當前毫秒已經存在元素,則順序編號加1即可,若原來最大的是1530000000000-12345,則新ID為1530000000000-12346
?? ?例如:redis> XADD s1 * k1 v1
?? ? ? ? ?1530513983956-0
? ? 一個絕殺問題
? ? 問:使用XADD 流名字 * key value命令時,產生新元素的ID的毫秒部分一定是當前時間戳的毫秒嗎?
? ? 答:不一定,因為若機器的當前時間比流中已有最大ID的毫秒時間要小(修改了機器時間導致)時,redis將使用最大ID的毫秒時間作為新ID的毫秒時間,順序部分加1,以此來避免時間倒流產生的問題。即redis保證新產生的ID一定是最大的
2. XTRIM 對流進行修剪,限制長度
?? ?格式:XTRIM steam MAXLEN len 返回值是被移除的元素的個數
?? ?例如:redis> XTRIM s1 MAXLEN 3
?? ? ? (integer) 2
?? ?說明刪除了2個最開頭的元素
?? ?其實XADD也可以限制流的長度
?? ?格式:XADD stream [MAXLEN len] id field value [field value ...]
? ? 例如:s1中已經有3個元素了,我們再添加一個
? ? ? ? redis> XADD s1 MAXLEN 3 * k1 v1
? ? ? ? 1400000000000-0
? ? ? ? 此時XADD命令將把該新元素添加到流mini-stream的末尾,并從流中移除一個最早的元素
3.?XDEL 移除指定元素,返回值是被移除的元素的數量
? ? 格式:XDEL stream [id id ... id]
? ? 例如:XDEL s1? 1000000000000 2000000000000
? ? (integer) 2? ? // 說明刪除了流s1中的兩個元素
4. XLEN 獲取流包含的元素數量,復雜度:O(1)
? ? 格式:XLEN stream
? ? 例如:XLEN stream-1
? ? (integer) 3? ? // 流包含3個元素
? ? 例如:XLEN empty-stream
? ? (integer) 0? ? // 空流
? ? 例如:XLEN not-exist-stream
? ? (integer) 0? ? // 流不存在
至于流如何遍歷請參考下篇博客?redis 流 stream的使用總結 - 如何遍歷?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的redis 流 stream的使用总结 - 基础命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git、GitHub、GitLab三者之
- 下一篇: redis 流 stream的使用总结