最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis Stream類型的使用詳解

 更新時間:2021年11月10日 09:21:30   作者:huan1993  
本文主要介紹了Redis Stream類型的使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、背景

最近在看redis這方面的知識,發(fā)現(xiàn)在redis5中產(chǎn)生了一種新的數(shù)據(jù)類型Stream,它和kafka的設(shè)計有些類似,可以當(dāng)作一個簡單的消息隊列來使用。

二、redis中Stream類型的特點

  • 是可持久化的,可以保證數(shù)據(jù)不丟失。
  • 支持消息的多播、分組消費。
  • 支持消息的有序性。

三、Stream的結(jié)構(gòu)

解釋:

消費者組: Consumer Group,即使用 XGROUP CREATE 命令創(chuàng)建的,一個消費者組中可以存在多個消費者,這些消費者之間是競爭關(guān)系。

  • 同一條消息,只能被這個消費者組中的某個消費者獲取。
  • 多個消費者之間是相互獨立的,互不干擾。

消費者: Consumer 消費消息。

last_delivered_id: 這個id保證了在同一個消費者組中,一個消息只能被一個消費者獲取。每當(dāng)消費者組的某個消費者讀取到了這個消息后,這個last_delivered_id的值會往后移動一位,保證消費者不會讀取到重復(fù)的消息。

pending_ids:記錄了消費者讀取到的消息id列表,但是這些消息可能還沒有處理,如果認為某個消息處理,需要調(diào)用ack命令。這樣就確保了某個消息一定會被執(zhí)行一次。

消息內(nèi)容:是一個鍵值對的格式。

Stream 中 消息的 ID: 默認情況下,ID使用 * ,redis可以自動生成一個,格式為 時間戳-序列號,也可以自己指定,一般使用默認生成的即可,且后生成的id號要比之前生成的大。

四、Stream的命令

1、XADD 往Stream末尾添加消息

1、命令格式

xadd key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|ID field value [field value ...]

2、舉例

xadd 命令 返回的是數(shù)據(jù)的id, xx-yy (xx指的是毫秒數(shù),yy指的是在這個毫秒內(nèi)的第幾條消息)

1、向流中增加一條數(shù)據(jù),

127.0.0.1:6379> xadd stream-key * username zhangsan # 向stream-key這個流中增加一個 username 是zhangsan的數(shù)據(jù) *表示自動生成id
"1635999858912-0" # 返回的是ID
127.0.0.1:6379> keys *
1) "stream-key" # 可以看到stream自動創(chuàng)建了
127.0.0.1:6379>

2、向流中增加數(shù)據(jù),不自動創(chuàng)建流

127.0.0.1:6379> xadd not-exists-stream nomkstream * username lisi # 因為指定了nomkstream參數(shù),而not-exists-stream之前不存在,所以加入失敗
(nil)
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379>

3、手動指定ID的值

127.0.0.1:6379> xadd stream-key 1-1 username lisi # 此處id的值是自己傳遞的1-1,而不是使用*自動生成
"1-1" # 返回的是id的值
127.0.0.1:6379>

4、設(shè)置一個固定大小的Stream1、精確指定Stream的大小

指定指定Stream的大小比模糊指定Stream的大小會稍微多少消耗一些性能。

2、模糊指定Stream的大小

127.0.0.1:6379> xadd stream-key maxlen ~ 1 * first first
"1636001034141-0"
127.0.0.1:6379> xadd stream-key maxlen ~ 1 * second second
"1636001044506-0"
127.0.0.1:6379> xadd stream-key maxlen ~ 1 * third third
"1636001057846-0"
127.0.0.1:6379> xinfo stream stream-key
 1) "length"
 2) (integer) 3
 3) "radix-tree-keys"
 4) (integer) 1
 5) "radix-tree-nodes"
 6) (integer) 2
 7) "last-generated-id"
 8) "1636001057846-0"
 9) "groups"
10) (integer) 0
11) "first-entry"
12) 1) "1636001034141-0"
    2) 1) "first"
       2) "first"
13) "last-entry"
14) 1) "1636001057846-0"
    2) 1) "third"
       2) "third"
127.0.0.1:6379>

~ 模糊指定流的大小,可以看到指定的是1,實際上已經(jīng)到了3.

2、XRANGE查看Stream中的消息

1、命令格式

xrange key start end [COUNT count]

2、準(zhǔn)備數(shù)據(jù)

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> xadd stream-key * username zhangsan
QUEUED
127.0.0.1:6379(TX)> xadd stream-key * username lisi
QUEUED
127.0.0.1:6379(TX)> exec
1) "1636003481706-0"
2) "1636003481706-1"
127.0.0.1:6379> xadd stream-key * username wangwu
"1636003499055-0"
127.0.0.1:6379>

使用redis的事務(wù)操作,獲取到同一毫秒產(chǎn)生的多條數(shù)據(jù),時間戳一樣,序列號不一樣

3、舉例

1、獲取所有的數(shù)據(jù)(-+的使用)

127.0.0.1:6379> xrange stream-key - +
1) 1) "1636003481706-0"
   2) 1) "username"
      2) "zhangsan"
2) 1) "1636003481706-1"
   2) 1) "username"
      2) "lisi"
3) 1) "1636003499055-0"
   2) 1) "username"
      2) "wangwu"
127.0.0.1:6379>

-: 表示最小id的值

+:表示最大id的值

2、獲取指定id范圍內(nèi)的數(shù)據(jù),閉區(qū)間

127.0.0.1:6379> xrange stream-key 1636003481706-1 1636003499055-0
1) 1) "1636003481706-1"
   2) 1) "username"
      2) "lisi"
2) 1) "1636003499055-0"
   2) 1) "username"
      2) "wangwu"
127.0.0.1:6379>

3、獲取指定id范圍內(nèi)的數(shù)據(jù),開區(qū)間

127.0.0.1:6379> xrange stream-key (1636003481706-0 (1636003499055-0
1) 1) "1636003481706-1"
   2) 1) "username"
      2) "lisi"
127.0.0.1:6379>

(:表示開區(qū)間

4、獲取某個毫秒后所有的數(shù)據(jù)

127.0.0.1:6379> xrange stream-key 1636003481706 +
1) 1) "1636003481706-0"
   2) 1) "username"
      2) "zhangsan"
2) 1) "1636003481706-1"
   2) 1) "username"
      2) "lisi"
3) 1) "1636003499055-0"
   2) 1) "username"
      2) "wangwu"
127.0.0.1:6379>

直接寫毫秒不寫后面的序列號即可。

5、獲取單條數(shù)據(jù)

127.0.0.1:6379> xrange stream-key 1636003499055-0 1636003499055-0
1) 1) "1636003499055-0"
   2) 1) "username"
      2) "wangwu"
127.0.0.1:6379>

startend的值寫的一樣即可獲取單挑數(shù)據(jù)。

6、獲取固定條數(shù)的數(shù)據(jù)

127.0.0.1:6379> xrange stream-key - + count 1
1) 1) "1636003481706-0"
   2) 1) "username"
      2) "zhangsan"
127.0.0.1:6379>

使用 count進行限制

3、XREVRANGE反向查看Stream中的消息

XREVRANGE key end start [COUNT count]

使用方式和XRANGE類似,略。

4、XDEL刪除消息

1、命令格式

xdel key ID [ID ...]

2、準(zhǔn)備數(shù)據(jù)

127.0.0.1:6379> xadd stream-key * username zhangsan
"1636004176924-0"
127.0.0.1:6379> xadd stream-key * username lisi
"1636004183638-0"
127.0.0.1:6379> xadd stream-key * username wangwu
"1636004189211-0"
127.0.0.1:6379>

3、舉例

需求:往Stream中加入3條消息,然后刪除第2條消息

127.0.0.1:6379> xdel stream-key 1636004183638-0
(integer) 1 # 返回的是刪除記錄的數(shù)量
127.0.0.1:6379> xrang stream -key - +
127.0.0.1:6379> xrange stream-key - +
1) 1) "1636004176924-0"
   2) 1) "username"
      2) "zhangsan"
2) 1) "1636004189211-0"
   2) 1) "username"
      2) "wangwu"
127.0.0.1:6379>

注意:

需要注意的是,我們從Stream中刪除一個消息,這個消息并不是被真正的刪除了,而是被標(biāo)記為刪除,這個時候這個消息還是占據(jù)著內(nèi)容空間的。如果所有Stream中所有的消息都被標(biāo)記刪除,這個時候才會回收內(nèi)存空間。但是這個Stream并不會被刪除。

5、XLEN查看Stream中元素的長度

1、命令格式

xlen key

2、舉例

查看Stream中元素的長度

127.0.0.1:6379> xadd stream-key * username zhangsan
"1636004690578-0"
127.0.0.1:6379> xlen stream-key
(integer) 1
127.0.0.1:6379> xlen not-exists-stream-key
(integer) 0
127.0.0.1:6379>

注意:

如果xlen后方的key不存在則返回0,否則返回元素的個數(shù)。

6、XTRIM對Stream中的元素進行修剪

1、命令格式

xtrim key MAXLEN|MINID [=|~] threshold [LIMIT count]

2、準(zhǔn)備數(shù)據(jù)

127.0.0.1:6379>  xadd stream-key * username zhangsan
"1636009745401-0"
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> xadd stream-key * username lisi
QUEUED
127.0.0.1:6379(TX)> xadd stream-key * username wangwu
QUEUED
127.0.0.1:6379(TX)> exec
1) "1636009763955-0"
2) "1636009763955-1"
127.0.0.1:6379> xadd stream-key * username zhaoliu
"1636009769625-0"
127.0.0.1:6379>

3、舉例

1、maxlen精確限制

127.0.0.1:6379> xtrim stream-key maxlen 2 # 保留最后的2個消息
(integer) 2
127.0.0.1:6379> xrange stream-key - + # 可以看到之前加入的2個消息被刪除了
1) 1) "1636009763955-1"
   2) 1) "username"
      2) "wangwu"
2) 1) "1636009769625-0"
   2) 1) "username"
      2) "zhaoliu"
127.0.0.1:6379>

上方的意思是,保留stream-key這個Stream中最后的2個消息。

2、minid模糊限制

minid 是刪除比這個id小的數(shù)據(jù),本地測試的時候沒有測試出來,略。

7、XREAD獨立消費消息

XREAD只是讀取消息,讀取完之后并不會刪除消息。 使用XREAD讀取消息,是完全獨立與消費者組的,多個客戶端可以同時讀取消息。

1、命令格式

xread [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]

2、準(zhǔn)備數(shù)據(jù)

127.0.0.1:6379> xadd stream-key * username zhangsan
"1636011801365-0"
127.0.0.1:6379> xadd stream-key * username lisi
"1636011806261-0"
127.0.0.1:6379> xadd stream-key * username wangwu
"1636011810905-0"
127.0.0.1:6379>

3、舉例

1、獲取用戶名是wangwu的數(shù)據(jù)

127.0.0.1:6379> xread streams stream-key 1636011806261-0 # 此處寫的是lisi的id,即讀取到的數(shù)據(jù)需要是 > 1636011806261-0
1) 1) "stream-key"
   2) 1) 1) "1636011810905-0"
         2) 1) "username"
            2) "wangwu"

2、獲取2條數(shù)據(jù)

127.0.0.1:6379> xread count 2 streams stream-key 0-0
1) 1) "stream-key"
   2) 1) 1) "1636011801365-0"
         2) 1) "username"
            2) "zhangsan"
      2) 1) "1636011806261-0"
         2) 1) "username"
            2) "lisi"
127.0.0.1:6379>

count限制單次讀取最后的消息,因為當(dāng)前讀取可能沒有這么多。

3、非阻塞讀取Stream對尾的數(shù)據(jù)

即讀取隊列尾的下一個消息,在非阻塞模式下始終是nil

127.0.0.1:6379> xread streams stream-key $
(nil)

4、阻塞讀取Stream對尾的數(shù)據(jù)

注意:

  • $表示讀取隊列最新進來的一個消息,不是Stream的最后一個消息。是xread block執(zhí)行后,再次使用xadd添加消息后,xread block才會返回。
  • block 0表示永久阻塞,當(dāng)消息到來時,才接觸阻塞。block 1000表示阻塞1000ms,如果1000ms還沒有消息到來,則返回nil
  • xread進行順序消費 當(dāng)使用xread進行順序消息時,需要記住返回的消息id,同時下次調(diào)用xread時,需要將上次返回的消息id傳遞進去。
  • xread讀取消息,完全無視消費組,此時Stream就可以理解為一個普通的list。

8、消費者組相關(guān)操作

1、消費者組命令

2、準(zhǔn)備數(shù)據(jù)

1、創(chuàng)建Stream的名稱是 stream-key

2、創(chuàng)建2個消息,aa和bb

127.0.0.1:6379> xadd stream-key * aa aa
"1636362619125-0"
127.0.0.1:6379> xadd stream-key * bb bb
"1636362623191-0"

3、創(chuàng)建消費者組

1、創(chuàng)建一個從頭開始消費的消費者組

xgroup create stream-key(Stream 名) g1(消費者組名) 0-0(表示從頭開始消費)

2、創(chuàng)建一個從Stream最新的一個消息消費的消費者組

xgroup create stream-key g2 $

$表示從最后一個元素消費,不包括Stream中的最后一個元素,即消費最新的消息。

4、創(chuàng)建一個從某個消息之后消費的消費者組

xgroup create stream-key g3 1636362619125-0  #1636362619125-0 這個是上方aa消息的id的值

1636362619125-0某個消息的具體的ID,這個g3消費者組中的消息都是大于>這個id的消息。

3、從消費者中讀取消息

127.0.0.1:6379> xreadgroup group g1(消費組名) c1(消費者名,自動創(chuàng)建) count 3(讀取3條) streams stream-key(Stream 名) >(從該消費者組中還未分配給另外的消費者的消息開始讀取)
1) 1) "stream-key"
   2) 1) 1) "1636362619125-0"
         2) 1) "aa"
            2) "aa"
      2) 1) "1636362623191-0"
         2) 1) "bb"
            2) "bb"
127.0.0.1:6379> xreadgroup group g2 c1 count 3 streams stream-key >
(nil) # 返回 nil 是因為 g2消費組是從最新的一條信息開始讀取(創(chuàng)建消費者組時使用了$),需要在另外的窗口執(zhí)行`xadd`命令,才可以再次讀取到消息
127.0.0.1:6379> xreadgroup group g3 c1 count 3 streams stream-key >  #只讀取到一條消息是因為,在創(chuàng)建消費者組時,指定了aa消息的id,bb消息的id大于aa,所以讀取出來了。
1) 1) "stream-key"
   2) 1) 1) "1636362623191-0"
         2) 1) "bb"
            2) "bb"
127.0.0.1:6379>

4、讀取消費者的pending消息

127.0.0.1:6379> xgroup create stream-key g4 0-0
OK
127.0.0.1:6379> xinfo consumers stream-key g1
1) 1) "name"
   2) "c1"
   3) "pending"
   4) (integer) 2
   5) "idle"
   6) (integer) 88792
127.0.0.1:6379> xinfo consumers stream-key g4
(empty array)
127.0.0.1:6379> xreadgroup group g1 c1 count 1 streams stream-key 1636362619125-0
1) 1) "stream-key"
   2) 1) 1) "1636362623191-0"
         2) 1) "bb"
            2) "bb"
127.0.0.1:6379> xreadgroup group g4 c1 count 1 block 0 streams stream-key 1636362619125-0
1) 1) "stream-key"
   2) (empty array)
127.0.0.1:6379>

5、轉(zhuǎn)移消費者的消息

127.0.0.1:6379> xpending stream-key g1 - + 10 c1
1) 1) "1636362619125-0"
   2) "c1"
   3) (integer) 2686183
   4) (integer) 1
2) 1) "1636362623191-0"
   2) "c1"
   3) (integer) 102274
   4) (integer) 7
127.0.0.1:6379> xpending stream-key g1 - + 10 c2
(empty array)
127.0.0.1:6379> xclaim stream-key g1 c2 102274 1636362623191-0
1) 1) "1636362623191-0"
   2) 1) "bb"
      2) "bb"
127.0.0.1:6379> xpending stream-key g1 - + 10 c2
1) 1) "1636362623191-0"
   2) "c2"
   3) (integer) 17616
   4) (integer) 8
127.0.0.1:6379>

也可以通過xautoclaim來實現(xiàn)。

6、一些監(jiān)控命令

1、查看消費組中消費者的pending消息

127.0.0.1:6379> xpending stream-key g1 - + 10 c2
1) 1) "1636362623191-0"
   2) "c2"
   3) (integer) 1247680
   4) (integer) 8
127.0.0.1:6379>

2、查看消費組中的消費者信息

127.0.0.1:6379> xinfo consumers stream-key g1
1) 1) "name"
   2) "c1"
   3) "pending"
   4) (integer) 1
   5) "idle"
   6) (integer) 1474864
2) 1) "name"
   2) "c2"
   3) "pending"
   4) (integer) 1
   5) "idle"
   6) (integer) 1290069
127.0.0.1:6379>

3、查看消費組信息

127.0.0.1:6379> xinfo groups stream-key
1) 1) "name"
   2) "g1"
   3) "consumers"
   4) (integer) 2
   5) "pending"
   6) (integer) 2
   7) "last-delivered-id"
   8) "1636362623191-0"
2) 1) "name"
   2) "g2"
   3) "consumers"
......

4、查看Stream信息

127.0.0.1:6379> xinfo stream stream-key
 1) "length"
 2) (integer) 2
 3) "radix-tree-keys"
 4) (integer) 1
 5) "radix-tree-nodes"
 6) (integer) 2
 7) "last-generated-id"
 8) "1636362623191-0"
 9) "groups"
10) (integer) 4
11) "first-entry"
12) 1) "1636362619125-0"
    2) 1) "aa"
       2) "aa"
13) "last-entry"
14) 1) "1636362623191-0"
    2) 1) "bb"
       2) "bb"
127.0.0.1:6379>

五、參考文檔

1、https://redis.io/topics/streams-intro

2、https://www.runoob.com/redis/redis-stream.html

到此這篇關(guān)于Redis Stream類型的使用詳解的文章就介紹到這了,更多相關(guān)Redis Stream類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Ubuntu?14.04系統(tǒng)上備份和恢復(fù)Redis數(shù)據(jù)詳細步驟

    在Ubuntu?14.04系統(tǒng)上備份和恢復(fù)Redis數(shù)據(jù)詳細步驟

    這篇文章主要給大家介紹了關(guān)于在Ubuntu?14.04系統(tǒng)上備份和恢復(fù)Redis數(shù)據(jù)的詳細步驟,文中通過代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Redis具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-04-04
  • Redis集群擴容的實現(xiàn)示例

    Redis集群擴容的實現(xiàn)示例

    本文介紹了在虛擬機上新建Redis集群,并將新增節(jié)點加入現(xiàn)有集群,通過配置文件和`redis-cli`命令,成功實現(xiàn)了Redis集群的擴容,感興趣的可以了解一下
    2025-02-02
  • RedisDesktopManager無法遠程連接Redis的完美解決方法

    RedisDesktopManager無法遠程連接Redis的完美解決方法

    下載RedisDesktopManager客戶端,輸入服務(wù)器IP地址,端口(缺省值:6379);點擊Test Connection按鈕測試連接,連接失敗,怎么回事呢?下面小編給大家?guī)砹薘edisDesktopManager無法遠程連接Redis的完美解決方法,一起看看吧
    2018-03-03
  • Redis中的BigKey問題排查與解決思路詳解

    Redis中的BigKey問題排查與解決思路詳解

    Redis是一款性能強勁的內(nèi)存數(shù)據(jù)庫,但是在使用過程中,我們可能會遇到Big Key問題,這個問題就是Redis中某個key的value過大,所以Big Key問題本質(zhì)是Big Value問題,這篇文章主要介紹了Redis中的BigKey問題:排查與解決思路,需要的朋友可以參考下
    2023-03-03
  • 利用Redis實現(xiàn)SQL伸縮的方法

    利用Redis實現(xiàn)SQL伸縮的方法

    本文主要介紹了如何通過鎖和時間序列等方面來提升傳統(tǒng)數(shù)據(jù)庫的性能等方法,利用Redis實現(xiàn)SQL伸縮,供有需要的朋友們參考。
    2015-09-09
  • Redis自動化安裝及集群實現(xiàn)搭建過程

    Redis自動化安裝及集群實現(xiàn)搭建過程

    這篇文章主要介紹了Redis自動化安裝以及集群實現(xiàn)搭建過程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • 5分鐘搭建redis集群(redis5.0.5)

    5分鐘搭建redis集群(redis5.0.5)

    本文主要介紹了5分鐘搭建redis集群,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • redisson中RRateLimiter分布式限流器的使用

    redisson中RRateLimiter分布式限流器的使用

    Redisson Ratelimiter是Redisson框架中的一種限流算法,用于限制對資源的訪問頻率,本文主要介紹了redisson中RRateLimiter分布式限流器的使用,感興趣的可以了解一下
    2024-06-06
  • Redis數(shù)據(jù)庫中實現(xiàn)分布式鎖的方法

    Redis數(shù)據(jù)庫中實現(xiàn)分布式鎖的方法

    這篇文章主要介紹了Redis數(shù)據(jù)庫中實現(xiàn)分布式鎖的方法,Redis是一個高性能的主存式數(shù)據(jù)庫,需要的朋友可以參考下
    2015-06-06
  • 為Redis設(shè)置密碼的三種方法

    為Redis設(shè)置密碼的三種方法

    Redis 是一個高性能的鍵值對數(shù)據(jù)庫,廣泛應(yīng)用于緩存、消息隊列等場景,為了保障 Redis 服務(wù)的安全性,設(shè)置密碼認證是非常重要的一步,所以本文給大家介紹了為Redis設(shè)置密碼的三種方法,需要的朋友可以參考下
    2024-11-11

最新評論

汕头市| 晋宁县| 西青区| 抚州市| 普安县| 马龙县| 泾源县| 新津县| 苏州市| 象州县| 叶城县| 启东市| 溧阳市| 滨海县| 扎赉特旗| 德昌县| 张家口市| 兰考县| 凌源市| 武胜县| 隆化县| 松潘县| 绥宁县| 黔西县| 焉耆| 通山县| 神农架林区| 威信县| 临桂县| 新晃| 马鞍山市| 凤翔县| 潼南县| 会同县| 南华县| 蒲城县| 大同县| 德格县| 普兰县| 九龙城区| 宿松县|