日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis 流 stream的使用总结 - 如何遍历

發布時間:2024/2/28 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis 流 stream的使用总结 - 如何遍历 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本博客講述如何對redis中的流進行遍歷

接上篇博客redis 流 stream的使用總結 - 基礎命令

簡言

1. XRANGE,XREVRANGE,XREAD命令只適合單個消費者模式,因為這三個命令都可以獲取流中的元素,也都可以刪除,只能實現公有訂閱(所有的消費者都能收到消息,也不是很安全),無法實現私有訂閱(所有消費者中,只有一個可以收到消息)

2. 若只有單個消費者,那么無論如何獲取,刪除,都是安全的

3. 若有多個消費者,請使用消費者組,具體可見下片博客?如何使用redis中流stream的組?

?

這篇主要講述3個命令

5.?XRANGE?順序訪問流中的元素,元素ID從小到大

6.?XREVRANGE?逆序訪問流中的元素,元素ID從大到小

7.?XREAD?以阻塞或非阻塞方式獲取流元素

?

具體用法及示例

5. XRANGE 順序訪問流中的元素,元素ID從小到大

? ? 格式:XRANGE stream start_id end_id [COUNT n]?

? ? 注釋:獲取流stream中ID大于等于start_id ,小于等于end_id 的元素列表,限制個數為n;若沒有符合條件的元素,會返回一個空列表

? ? 例1:XRANGE s1 2000000000000 2000000000000

? ? 注釋:這樣可以獲取指定的單個元素

? ? 1) 1) 2000000000000-0? ? // 流元素的ID

? ? ? ? 2) 1) "k1"? ? ? ? ? ? ? ? ? // 流元素包含的鍵

? ? ? ? ? ? 2) "v1"? ? ? ? ? ? ? ? ? // 流元素包含的值

? ? 例2:XRANGE s1 3000000000000 4000000000000

? ? 注釋:獲取指定ID范圍內的多個元素

? ? 1) 1) 3000000000000-0? ? // 符合ID范圍的第1個元素

? ? ? ? 2) 1) "k1"? ? ? ? ? ? ? ? ?

? ? ? ? ? ? 2) "v1"? ? ? ? ? ? ? ? ?

? ? 2) 1) 4000000000000-0? ? //?符合ID范圍的最后一個元素

? ? ? ? 2) 1) "k1"? ? ? ? ? ? ? ? ?

? ? ? ? ? ? 2) "v1"?

? ? 例3:XRANGE s1 - +

? ? 注釋:獲取所有元素,- 表流中最小元素ID,+ 表流中最大元素ID

? ? 1) 1) 1000000000000-0? ? // 流中最小元素ID

? ? ? ? 2) 1) "k1"? ? ? ? ? ? ? ? ?

? ? ? ? ? ? 2) "v1"? ? ? ?

? ? .....省略中間元素.....? ? ? ? ?

? ? 4) 1) 4000000000000-0? ? // 流中最大元素ID

? ? ? ? 2) 1) "k1"? ? ? ? ? ? ? ? ?

? ? ? ? ? ? 2) "v1"?

? ? 例4:對流進行迭代,具體步驟如下

? ? 步驟1:使用 - 作為起始ID,+ 作為結束ID,調用帶有COUNT選項的XRANGE 命令,獲取流的前N個元素

? ? 步驟2:對于步驟1返回的最后一個元素,將該元素ID的順序部分加1,得到一個新ID

? ? 步驟3:使用新ID作為起始ID,+ 作為結束ID,繼續調用帶有COUNT選項的XRANGE命令,直到返回的列表為空或少于我們限定的COUNT值,說明已經遍歷完畢

? ? 示例步驟1:redis> XRANGE s1 - + COUNT 2

? ? 1) 1) 1000000000000-0? ? // 第一個元素ID

? ? ? ? 2) 1) "k1"? ? ? ? ? ? ? ? ?

? ? ? ? ? ? 2) "v1"? ? ? ??

? ? 2) 1) 1000000000000-1? ? // 第二個元素ID

? ? ? ? 2) 1) "k1"? ? ? ? ? ? ? ? ?

? ? ? ? ? ? 2) "v1"?

? ? 由于正常返回了2個元素,我們假設后面還有元素,把元素ID?1000000000000-1的順序部分加1得到1000000000000-2,進行第2步

? ? 示例步驟2:redis> XRANGE s1?1000000000000-2 + COUNT 1

? ? 1) 1) 2000000000000-0? ? // 第一個元素ID

? ? ? ? 2) 1) "k1"? ? ? ? ? ? ? ? ?

? ? ? ? ? ? 2) "v1"? ?

? ? 由于只返回了1個元素,所以后面已經沒有元素了,結束遍歷;當然如果步驟2返回的列表為空,也說明遍歷完畢了

6. XREVRANGE 逆序訪問流中的元素,元素ID從大到小

? ? 格式:XREVRANGE stream end_id start_id [COUNT n]?

? ? 注意:該命令格式前面是結束ID,后面是起始ID,與XRANGE命令正好相反

? ? 例如:XREVRANGE s1 + - COUNT 2

? ? 1) 1) 4000000000000-0? ? // 最大元素ID

? ? ? ? 2) 1) "k1"? ? ? ? ? ? ? ? ?

? ? ? ? ? ? 2) "v1"? ? ? ? ? ? ? ? ?

? ? 2) 1) 3000000000000-0? ? // 第二大元素ID

? ? ? ? 2) 1) "k1"? ? ? ? ? ? ? ? ?

? ? ? ? ? ? 2) "v1"

7. XREAD 以阻塞或非阻塞方式獲取流元素,ID從小往大進行遍歷,可以同時對多個流進行遍歷,能夠以阻塞和非阻塞方式進行

? ? 注意:XRANGE命令 是大于等于元素ID,而XREAD 命令是大于元素ID,沒有等于

? ? 格式:XREAD [COUNT n] STREAMS stream1 stream2 stream3 ... id1 id2 id3 ...

? ? 例如:redis> XREAD COUNT 1?STREAMS s1 s2 s3 1000000000000 1000000000000 1000000000000

? ? 注釋:從流 s1 s2 s3 中各取出一個ID大于?1000000000000的元素,我們

? ? 1) 1) "s1"? // 下面的元素來自流 s1

? ? ? ? 2) 1) 1) 1100000000000-0 // 第一個元素的ID

? ? ? ? ? ? ? ? ?2) 1) "k1" // 第一個元素的ID鍵值對

? ? ? ? ? ? ? ? ? ? ?2) "v1"

? ? 2) 1) "s2"? // 下面的元素來自流 s2

? ? ? ? 2) 1) 1) 1531743117644-0 // 第一個元素的ID

? ? ? ? ? ? ? ? ?2) 1) "k1" // 第一個元素的ID鍵值對

? ? ? ? ? ? ? ? ? ? ?2) "v1"

? ? 3) 1) "s3"? // 下面的元素來自流 s3

? ? ? ? 2) 1) 1) 1531748220373-0 // 第一個元素的ID

? ? ? ? ? ? ? ? ?2) 1) "k1" // 第一個元素的ID鍵值對

? ? ? ? ? ? ? ? ? ? ?2) "v1"

? ? 迭代流

? ? 步驟1:將表示流起點的特殊ID 0-0 (或者簡寫0都可以)作為ID傳入,調用XREAD命令

? ? 步驟2:使用命令返回的最后一個元素ID作為ID參數,再次調用XREAD命令,直到返回的空列表或者個數少于我們限定的COUNT值

? ? 示例步驟1:redis> XREAD?COUNT 2 s1 0-0

? ? 1) 1) "s1"? // 下面的元素來自流 s1

? ? ? ? 2) 1) 1) 1100000000000-0 // 第一個元素

? ? ? ? ? ? ? ? ?2) 1) "k1"

? ? ? ? ? ? ? ? ? ? ?2) "v1"

? ? ? ? ? ? 2) 1) 1200000000000-0 // 第二個元素

? ? ? ? ? ? ? ? ?2) 1) "k1"

? ? ? ? ? ? ? ? ? ? ?2) "v1"

? ? 這個命令會從流s1中取出最開始的兩個元素,它們的ID分別為1100000000000-0和1200000000000-0,我們直接用?1200000000000-0作為新ID,調用步驟2,不需加1,因為 XREAD會取出ID大于該值的元素,而XRANGE是大于等于

? ? 示例步驟2:redis> XREAD COUNT 2 s1?1200000000000-0

? ? 1) 1) "s1"? // 下面的元素來自流 s1

? ? ? ? 2) 1) 1) 1500000000000-0 // 第一個元素

? ? ? ? ? ? ? ? ?2) 1) "k1"

? ? ? ? ? ? ? ? ? ? ?2) "v1"

? ? 由于這次只返回了一個元素,說明遍歷完畢;再次調用XREAD命令,會返回空列表的

XRANGE 和 XREAD的區別

1. XRANGE的ID是一個范圍,范圍是閉區間,即【】,而XREAD的ID是一個值,且是開區間,即 (

2. XRANGE遍歷時需計算ID值,即拿上一次遍歷的最后一個元素的ID的順序部分加1;而XREAD不需要,直接用即可

3. 遍歷方向:?XRANGE是從頭到尾,XREVRANGE是從尾到頭;而XREAD只能從頭到尾

4. XRANGE 和 XREVRANGE 一次只能遍歷一個流;XREAD一次可以遍歷多個流

5. XRANGE 和 XREVRANGE 只能獲取已有的元素,不等待;而 XREAD可以阻塞等待一段時間

XREAD 阻塞調用

? ? 格式:XREAD [BLOCK ms] [COUNT n] STREAMS stream1 stream2 stream3 ... id1 id2 id3 ...

? ? 注意:BLOCK可以是大于等于0的任何值,0表一直阻塞直到出現了可返回的元素為止。若一直沒有元素,超時則返回空列表

只獲取新出現的元素(即只從當前時刻開始獲取流中新出現的元素,換句話說我們要“監聽”新元素,不要歷史的)

? ? 格式:XREAD BLOCK?ms STREAMS stream1 stream2 stream3 ... $ $ $ ...

? ? 注意:就是把ID換成了特殊符號 $,這樣XREAD命令就會只獲取給定流在命令執行之后新出現的元素

? ??例如:redis> XREAD BLOCK 10000000? STREAMS bs1 $

? ? 注釋:執行命令后,本客戶端將進入阻塞狀態,直到10000000ms內有新元素

? ? 1) 1) "bs1"? // 下面的元素來自流 bs1

? ? ? ? 2) 1) 1) 1300000000000-0 // 第一個元素的ID

? ? ? ? ? ? ? ? ?2) 1) "k1"

? ? ? ? ? ? ? ? ? ? ?2) "v1"

? ? 下篇我們講解 消費者組的概念?redis 流 stream的使用總結 - 消費者組

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的redis 流 stream的使用总结 - 如何遍历的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。