redis學習筆記 發布和訂閱

2021-08-11 20:28:27 字數 3637 閱讀 7247

除了任務佇列以外,redis還有一種基於「發布/訂閱」模式的訊息傳遞,它能讓訊息在多個頻道以及多個客戶端之間進行訊息傳遞。

向頻道發布訊息使用命令publish channel message

redis > publish chan1 hello

(integer) 0

訊息傳送成功後,將會返回乙個整數,表示收到這條訊息的訂閱者數量,本例中的0即表示當前沒有使用者訂閱該頻道。訊息發布後不會被持久化,如果客戶端當前沒有訂閱該頻道,後續再訂閱也不會收到訂閱前的訊息。

訂閱頻道使用命令subscribe channel

redis > subscribe chan1  

reading messages... (press ctrl-c to quit)

1) "subscribe"

2) "chan1"

3) (integer) 1

訂閱後會返回乙個subcribe型別的訊息,該訊息包含三行,第一行為subcribe表示訂閱成功,第二行chann1是訂閱的頻道名,第三行是當前客戶端訂閱的頻道數量。

此時客戶端將進入訂閱模式,使用redis-cli終端時該命令會阻塞,第三方客戶端中也只能輸入subscribeunsubscribepsubscribepunsubscribe這四個屬於「發布/訂閱」模式的命令。如果再使用publish chann1 hellochann1發布訊息,訂閱者就會收到訊息:

1) "message"

2) "chan1"

3) "hello"

訊息有三個值,第乙個值message表示這是一條訊息,和上面的subcribe區分。第二個值表示訊息的**頻道名,第三個值是訊息的內容。

取消訂閱使用命令unsubscribe [channel ...],帶上頻道名取消特定頻道,預設取消所有頻道。

由於redis-cli在訂閱後會阻塞,無法手動輸入取消訂閱命令,如果要取消訂閱使用ctrl-c退出即可。在第三方客戶端例如python或者其他程式語言客戶端中要取消訂閱,需要進行subscribe操作。

psubscribepunsubscribe命令和上面的兩個命令類似,只是這兩個命令允許頻道名使用萬用字元引數,例如psubscribe chan?將會訂閱類似chan1 chan2 chan3...的頻道:

redis > psubscribe chan?

reading messages... (press ctrl-c to quit)

1) "psubscribe"

# 訂閱

2) "chan?"

# 訂閱的頻道

3) (integer) 1

# 當前訂閱的頻道

這裡的返回值和subscribe命令一致,只是在收到訊息後會多出乙個值:

1) "pmessage"

# 訊息型別

2) "chan?"

# 訂閱的頻道規則

3) "chan1"

# 實際的頻道

4) "abc"

# 訊息的內容

psubscribe可以重複訂閱頻道,訂閱後將會顯示實際訂閱的頻道資訊:

redis > psubscribe chan1 chan?

reading messages... (press ctrl-c to quit)

1) "psubscribe"

2) "chan1"

3) (integer) 1

1) "psubscribe"

2) "chan?"

3) (integer) 2

此時,發布一則訊息訂閱者將會接收多次,次數根據訂閱規則數量的不同而不同。同時,發布者此時也會顯示有多個訂閱者接收到了這條訊息:

# 發布者

127.0.0.1:6379> publish chan1 abc # 傳送訊息

(integer) 2

# 有兩個訂閱者收到了訊息

# 訂閱者

1) "pmessage"

# 第一條訊息

2) "chan1"

3) "chan1"

4) "abc"

1) "pmessage"

# 第二條訊息

2) "chan?"

# 訂閱規則

3) "chan1"

# 實際接收的頻道

4) "abc"

最有有乙個要注意的點是:使用psubscribe訂閱的頻道只能使用punsubscribe命令取消訂閱。

# -*- coding: utf8 -*-

"""訂閱者**

"""import redis

defsubscribe

(conn):

pub_sub = conn.pubsub()

pub_sub.subscribe(["chan"])

i = 0

for item in pub_sub.listen(): # 迴圈監聽訂閱訊息

print item

i += 1

if i == 2:

pub_sub.unsubscribe() # 取消訂閱

elif i == 3: # 退出監聽

print

"exit"

break

if __name__ == "__main__":

conn = redis.strictredis()

subscribe(conn)

# -*- coding:utf8 -*-

"""發布者

"""import redis

defpublish

(conn):

for i in range(5):

conn.publish("chan", i) # 發布訊息

if __name__ == "__main__":

conn = redis.strictredis()

publish(conn)

先執行訂閱者,將會先列印一條訂閱的訊息:

然後執行發布者**,訂閱者輸出:

exit

根據書上的描述,在取消訂閱後將會收到一條取消訂閱的訊息:

但是這裡並沒有收到,很奇怪,不知道是不是版本的原因,暫且把問題放在這裡吧。

Redis學習筆記 發布訂閱

redis提供了基於 發布 訂閱 模式的訊息機制,此種模式下,訊息發布者和訂閱者不進行直接通訊,發布者客戶端向指定的頻道 channel 發布訊息,訂閱該頻道的每個客戶端都可以收到該訊息 和很多專業的訊息佇列系統 例如kafka rocketmq 相比,redis的發布訂閱略顯粗糙,例如無法實現訊息...

Redis 發布和訂閱

發布與訂閱 又稱pub sub 訂閱者 listener 負責訂閱頻道 channel 傳送者 publisher 負責向頻道傳送二進位制字串訊息 binary string message 每當有訊息被傳送給指定頻道的時候,頻道都所有訂閱者都會收到訊息。redis提供都5個發布訂閱命令 命令描述 ...

Redis 發布和訂閱

一 概述 1 發布和訂閱是一種訊息通訊模式。2 優點 使訊息訂閱者和訊息發布者耦合度降低,類似設計模式中的觀察者模式。二 發布和訂閱 訂閱命令 訂閱乙個或多個頻道 返回值 value 1 為 subcribe 表示訂閱成功,value 2 為訂閱的頻道名稱,value 3 表示當前訂閱的頻道個數 s...