Redis 釋出訂閱功能
簡介
Redis提供了基於“釋出/訂閱”模式的訊息機制,此種模式下,訊息釋出者和訂閱者不進行直接通訊,釋出者客戶端向指定的頻道(channel)釋出訊息,訂閱該頻道的每個客戶端都可以收到該訊息(頻道沒有”建立“的概念,可以直接訂閱、亦可直接釋出訊息)。
命令
釋出訊息
PUBLISH
自2.0.0可用。
**時間複雜度:**O(N+M),其中
N
是頻道channel
的訂閱者數量,而M
則是使用模式訂閱(subscribed patterns)的客戶端的數量。
語法:PUBLISH channel message
說明:
將資訊 message
channel
。
返回值:
接收到資訊 message
的訂閱者數量。
示例:
# 向沒有訂閱者的頻道傳送資訊
coderknock> PUBLISH new_channel "test publish"
(integer) 0
# 向有訂閱者的頻道傳送資訊
coderknock> PUBLISH channel1 "new channel1"
(integer) 1
訂閱
SUBSCRIBE
自2.0.0可用。
**時間複雜度:**O(N),其中
N
是訂閱的頻道的數量。
語法:SUBSCRIBE channel [channel …]
說明:
訂閱給定的一個或多個頻道的資訊。
返回值:
接收到的資訊(請參見下面的程式碼說明)。
示例:
coderknock> SUBSCRIBE channel1
Reading messages... (press Ctrl-C to quit)
# 訂閱成功
1) "subscribe" # 返回值的型別:顯示訂閱成功
2) "channel1" # 訂閱的頻道名字
3) (integer) 1 # 目前已訂閱的頻道數量
# 接收到資訊
1) "message" # 返回值的型別:資訊
2) "channel1" # 來源(從哪個頻道傳送過來)
3) "new channel1" # 資訊內容
#### PSUBSCRIBE
自2.0.0可用。
**時間複雜度:**O(N),
N
是訂閱的模式的數量。
語法:PSUBSCRIBE pattern [pattern …]
說明:
訂閱一個或多個符合給定模式的頻道。
每個模式以 *
作為匹配符,比如 it*
匹配所有以 it
開頭的頻道( it.news
、 it.blog
、 it.tweets
等等), news.*
匹配所有以 news.
開頭的頻道( news.it
、 news.global.today
等等),諸如此類。
返回值:
接收到的資訊(請參見下面的程式碼說明)。
示例:
coderknock> PSUBSCRIBE news.* coderknock.*
Reading messages... (press Ctrl-C to quit)
# 訂閱成功
1) "psubscribe" # 返回值的型別:顯示訂閱成功
2) "news.*" # 訂閱的頻道名字
3) (integer) 1 # 目前已訂閱的頻道數量
1) "psubscribe"
2) "coderknock.*"
3) (integer) 2
# 接收到資訊
1) "pmessage" # 返回值的型別:資訊
2) "news.*" # 來源頻道模式
3) "news.123" # 具體頻道(從哪個頻道傳送過來)
4) "123 # 訊息
1) "pmessage"
2) "news.*"
3) "news.222"
4) "222"
### 檢視釋出/訂閱系統狀態
### PUBSUB
自2.8.0可用。
**時間複雜度:**O(N),
N
是訂閱的模式的數量。
語法:PUBSUB subcommand [argument [argument …]]
說明:
PUBSUB
是一個檢視訂閱與釋出系統狀態的內省命令, 它由數個不同格式的子命令組成, 以下將分別對這些子命令進行介紹。
PUBSUB CHANNELS [pattern]
說明:
列出當前的活躍頻道。
活躍頻道指的是那些至少有一個訂閱者的頻道, 訂閱模式的客戶端不計算在內。
pattern
引數是可選的:
- 如果不給出
pattern
引數,那麼列出訂閱與釋出系統中的所有活躍頻道。 - 如果給出
pattern
引數,那麼只列出和給定模式pattern
相匹配的那些活躍頻道。
複雜度: O(N) , N
為活躍頻道的數量(對於長度較短的頻道和模式來說,將進行模式匹配的複雜度視為常數)。
返回值: 一個由活躍頻道組成的列表。
示例:
# 客戶端1
coderknock> SUBSCRIBE coderknock sanchan news test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "coderknock"
3) (integer) 1
1) "subscribe"
2) "sanchan"
3) (integer) 2
1) "subscribe"
2) "news"
3) (integer) 3
1) "subscribe"
2) "test"
3) (integer) 4
# 客戶端2
coderknock> SUBSCRIBE coderknock sanchan blog oschina
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "coderknock"
3) (integer) 1
1) "subscribe"
2) "sanchan"
3) (integer) 2
1) "subscribe"
2) "blog"
3) (integer) 3
1) "subscribe"
2) "oschina"
3) (integer) 4
# 統計出的有訂閱的頻道
coderknock> PUBSUB CHANNELS
1) "coderknock"
2) "sanchan"
3) "blog"
4) "news"
5) "oschina"
6) "test"
# 統計頻道名包含 o 的頻道
coderknock> PUBSUB CHANNELS *o*
1) "coderknock"
2) "blog"
3) "oschina"
#我們關閉客戶端1,只有客戶端1訂閱的 "news" "test" 頻道消失
coderknock> PUBSUB CHANNELS
1) "blog"
2) "oschina"
3) "coderknock"
4) "sanchan"
# 重新訂閱
# 客戶端1
coderknock>PSUBSCRIBE news.* coderknock.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
1) "psubscribe"
2) "coderknock.*"
3) (integer) 2
# 客戶端2
coderknock> PSUBSCRIBE sanchan.* coderknock.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "sanchan.*"
3) (integer) 1
1) "psubscribe"
2) "coderknock.*"
3) (integer) 2
# 客戶端3
coderknock> PSUBSCRIBE sanchan.* coderknock.* news blog
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "sanchan.*"
3) (integer) 1
1) "psubscribe"
2) "coderknock.*"
3) (integer) 2
1) "psubscribe"
2) "news"
3) (integer) 3
1) "psubscribe"
2) "blog"
3) (integer) 4
# 說明不會統計 PSUBSCRIBE 訂閱
coderknock> PUBSUB CHANNELS
(empty list or set)
PUBSUB NUMSUB [channel-1 … channel-N]
說明:
返回給定頻道的訂閱者數量, 訂閱模式的客戶端不計算在內。
**複雜度:**O(N) , N
為給定頻道的數量。
返回值: 一個多條批量回復(Multi-bulk reply),回覆中包含給定的頻道,以及頻道的訂閱者數量。 格式為:頻道 channel-1
, channel-1
的訂閱者數量,頻道 channel-2
, channel-2
的訂閱者數量,諸如此類。 回覆中頻道的排列順序和執行命令時給定頻道的排列順序一致。 不給定任何頻道而直接呼叫這個命令也是可以的, 在這種情況下, 命令只返回一個空列表。
示例:
# 訂閱的客戶端
#客戶端1
coderknock> SUBSCRIBE coderknock sanchan blog oschina
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "coderknock"
3) (integer) 1
1) "subscribe"
2) "sanchan"
3) (integer) 2
1) "subscribe"
2) "blog"
3) (integer) 3
1) "subscribe"
2) "oschina"
3) (integer) 4
#客戶端2
coderknock> SUBSCRIBE coderknock sanchan news test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "coderknock"
3) (integer) 1
1) "subscribe"
2) "sanchan"
3) (integer) 2
1) "subscribe"
2) "news"
3) (integer) 3
1) "subscribe"
2) "test"
3) (integer) 4
#客戶端3
coderknock> PSUBSCRIBE sanchan.* coderknock.* news blog
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "sanchan.*"
3) (integer) 1
1) "psubscribe"
2) "coderknock.*"
3) (integer) 2
1) "psubscribe"
2) "news"
3) (integer) 3
1) "psubscribe"
2) "blog"
3) (integer) 4
# 統計,可以看到 PSUBSCRIBE 訂閱同樣不會被統計而且不支援模式匹配
coderknock> PUBSUB NUMSUB coderknock news blog oschina test sanchan coderknock.*
1) "coderknock"
2) (integer) 2
3) "news"
4) (integer) 1
5) "blog"
6) (integer) 1
7) "oschina"
8) (integer) 1
9) "test"
10) (integer) 1
11) "sanchan"
12) (integer) 2
13) "coderknock.*"
14) (integer) 0
PUBSUB NUMPAT
說明:
返回 訂閱模式 的數量。
注意, 這個命令返回的不是訂閱模式的客戶端的數量, 而是客戶端訂閱的所有模式的數量總和。
**複雜度:**O(N) , N
為給定頻道的數量。
返回值: 一個整數回覆(Integer reply)。
示例:
#採用上面示例中的訂閱客戶端,這裡統計的 訂閱模式 包含 PSUBSCRIBE 訂閱
coderknock> PUBSUB NUMPAT
(integer) 8
# 新增一個客戶端4
coderknock> PSUBSCRIBE blog*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "blog*"
3) (integer) 1
# 統計會發現模式增加 1
coderknock> PUBSUB NUMPAT
(integer) 9
### 退訂
#### UNSUBSCRIBE
自2.0.0可用。
**時間複雜度:**O(N) ,
N
是客戶端已訂閱的頻道的數量。
語法:UNSUBSCRIBE [channel [channel …]]
說明:
指示客戶端退訂給定的頻道。
如果沒有頻道被指定,也即是,一個無引數的 UNSUBSCRIBE
呼叫被執行,那麼客戶端使用 SUBSCRIBE
命令訂閱的所有頻道都會被退訂。在這種情況下,命令會返回一個資訊,告知客戶端所有被退訂的頻道。
返回值:
這個命令在不同的客戶端中有不同的表現。
示例:
在命令列中該命令無法測試(訂閱後命令行會阻塞),我們使用 python 進行測試:
import redis
import time
r = redis.StrictRedis(host='127.0.0.1', password='admin123', port=6379, db=0)
p = r.pubsub()
p.subscribe("coderknock", "sanchan", "python")
"""
# 基於上一個命令的示例,此時在客戶端中執行
coderknock> PUBSUB CHANNELS
1) "python"
2) "blog"
3) "news"
4) "test"
5) "oschina"
6) "coderknock"
7) "sanchan"
# 說明訂閱成功
# 統計訂閱數量
coderknock> PUBSUB NUMSUB coderknock news blog oschina test sanchan coderknock.* python
1) "coderknock"
2) (integer) 3
3) "news"
4) (integer) 1
5) "blog"
6) (integer) 1
7) "oschina"
8) (integer) 1
9) "test"
10) (integer) 1
11) "sanchan"
12) (integer) 3
13) "coderknock.*"
14) (integer) 0
15) "python"
16) (integer) 1
"""
time.sleep(10) # 休眠 10 秒
p.unsubscribe("sanchan")
"""
# 此時取消了一個 sanchan 的訂閱
coderknock> PUBSUB NUMSUB coderknock news blog oschina test sanchan coderknock.* python
1) "coderknock"
2) (integer) 3
3) "news"
4) (integer) 1
5) "blog"
6) (integer) 1
7) "oschina"
8) (integer) 1
9) "test"
10) (integer) 1
11) "sanchan"
12) (integer) 2
13) "coderknock.*"
14) (integer) 0
15) "python"
16) (integer) 1
"""
time.sleep(10) # 休眠 10 秒
p.unsubscribe()
"""
# 此時該 python 中訂閱全部退訂
coderknock> PUBSUB NUMSUB coderknock news blog oschina test sanchan coderknock.* python
1) "coderknock"
2) (integer) 2
3) "news"
4) (integer) 1
5) "blog"
6) (integer) 1
7) "oschina"
8) (integer) 1
9) "test"
10) (integer) 1
11) "sanchan"
12) (integer) 2
13) "coderknock.*"
14) (integer) 0
15) "python"
16) (integer) 0
"""
#### UNSUBSCRIBE
自2.0.0可用。
**時間複雜度:**O(N+M) ,其中
N
是客戶端已訂閱的模式的數量,M
則是系統中所有客戶端訂閱的模式的數量。
語法:PUNSUBSCRIBE [pattern [pattern …]]
說明:
指示客戶端退訂所有給定模式。
如果沒有模式被指定,也即是,一個無引數的 PUNSUBSCRIBE
呼叫被執行,那麼客戶端使用 PSUBSCRIBE
命令訂閱的所有模式都會被退訂。在這種情況下,命令會返回一個資訊,告知客戶端所有被退訂的模式
返回值:
這個命令在不同的客戶端中有不同的表現。
有關訂閱命令有兩點需要注意:
- 客戶端在執行訂閱命令之後進入了訂閱狀態,只能接收
SUBSCRIBE
、PSUBSCRIBE
、UNSUBSCRIBE
、PUNSUBSCRIBE
四個命令。 - 開啟的訂閱客戶端,無法收到該頻道之前的訊息,因為 Redis 不會對釋出的訊息進行持久化。
和很多專業的訊息佇列系統(例如Kafka、RocketMQ)相比,Redis的釋出訂閱略顯粗糙,例如無法實現訊息堆積和回溯。但勝在足夠簡單,如果當前場景可以容忍的這些缺點,也不失為一個不錯的選擇。
我是廣告
本人 Redis 方面的講座已經上線快去看看有沒有你感興趣的吧(說不定會有優惠喲~~數量有限要抓緊呀):
以上課程現在可以打包購買了 Redis 系列講座合集
打包購買更實惠
相關推薦
Redis 釋出訂閱功能
簡介 Redis提供了基於“釋出/訂閱”模式的訊息機制,此種模式下,訊息釋出者和訂閱者不進行直接通訊,釋出者客戶端向指定的頻道(channel)釋出訊息,訂閱該頻道的每個客戶端都可以收到該訊息(頻道沒有”建立“的概念,可以直接訂閱、亦可直接釋出訊息)。
Redis 釋出訂閱,小功能大用處,真沒那麼廢材!
![jae-park-7GX5aICb5i4-unsplash](https://img2020.cnblogs.com/other/1419561/202009/1419561-20200923071551245-480949487.jpg) 今天小黑哥來跟大家介紹一下 Redis 釋出/訂閱功能。 也
006-Redis 釋出訂閱
Redis 釋出訂閱(pub/sub)是一種訊息通訊模式:傳送者(pub)傳送訊息,訂閱者(sub)接收訊息。 Redis 客戶端可以訂閱任意數量的頻道。 下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關係:
Redis 釋出訂閱與事物
一、Redis的釋出和訂閱 Redis 釋出訂閱(pub/sub)是一種訊息通訊模式:傳送者(pub)傳送訊息,訂閱者(sub)接收訊息 Redis 客戶端可以訂閱任意數量的頻道 Redis的釋出訂閱機制包括三個部分,釋出者,訂閱者和Channel 釋出者
Java架構學習(三十)redis高階&redis高可用&主從複製&讀寫分離&叢集&哨兵機制&持久化RDB儲存&持久化AOF儲存&事務機制&Redis釋出訂閱
redis高階 一、基礎回顧 什麼是redis? 答:redis是非關係型資料庫,使用redis的目的是:減輕資料庫訪問壓力。 資料庫是做IO操作,使用redis是記憶體操作,記憶體資料庫, 效率要比IO效率高。這個就是快取。 如果資料庫值與redis
Python&Redis 釋出訂閱
1、Redis控制檯操作 先開啟一個Redis控制檯開啟訂閱: SUBSCRIBE fm666 返回引數解釋: subscribe,表示訂閱成功 unsubscribe,表示取消訂閱成功 messag
spring-data-redis實現redis釋出訂閱
maven 依賴包 <properties> <spring.version>5.1.0.RELEASE</spring.version> </properties> <dependencies
redis 釋出訂閱 python實現
一、首先實現一個redis類,提供給訂閱者和釋出者呼叫 import redis class RedisHelper: def __init__(self): # 連結服務端 self.__conn = redis.Redis(host='127.0.
Redis釋出訂閱
redis釋出訂閱 redis配置 # 配置redis連線池屬性 spring.redis.jedis.pool.max-active=10 spring.redis.jedis.pool.max-idle=10 spring.redis.jedis.pool.
redis 釋出/訂閱(Pub/Sub) 原始碼分析
* 背景 釋出者和訂閱者都是Redis客戶端,Channel則為Redis伺服器端,釋出者將訊息傳送到某個的頻道,訂閱了這個頻道的訂閱者就能接收到這條訊息。 Redis的這種釋出訂閱機制與基於主題的釋出訂閱類似,Channel相當於主題。 原理圖如下: * 命令
【Redis釋出訂閱】
Redis通過PUBLISH、SUBSCRIBE等命令實現釋出與訂閱模式。 舉例:QQ群的公告,單個釋出者,多個收聽著。 *** 釋出/訂閱 PUBLISH 頻道 訊息 將訊息釋出到指定的頻道。 . SUBSCRIBE 頻道1 [頻道2] [...] 可同時訂閱多個頻道。 . UNSUBSCR
Redis釋出訂閱實現原理
釋出訂閱中使用到的命令就只有三個:PUBLISH,SUBSCRIBE,PSUBSCRIBE PUBLISH 用於釋出訊息 SUBSCRIBE 也叫頻道訂閱,用於訂閱某一特定的頻道 PSUBSCRIBE 也叫模式訂閱,用於訂閱某一組頻道,使用glob的方式,比如xxx-*可以匹配xxx-a,和xxx-b,xx
Redis釋出訂閱機制在PHP中的運用
在寫這篇文章之前,我已經完成實踐,想深入瞭解redis的釋出訂閱模式與實際運用,這種模式為生產者和消費者,可為1-1的關係(為訊息佇列),也可為1-N的關係,據說可運用場景為對資料可靠性要求不高的場
SpringBoot Redis 釋出訂閱
1.pom 依賴 <dependency> <groupId>org.springframework.boot</groupId> &nb
Redis釋出訂閱機制
1. 什麼是Redis Redis是一個開源的記憶體資料庫,它以鍵值對的形式儲存資料。由於資料儲存在記憶體中,因此Redis的速度很快,但是每次重啟Redis服務時,其中的資料也會丟失,因此,Redis也提供了持久化儲存機制,將資料以某種形式儲存在檔案中,每次重啟時,可以自動從檔案載入資料到記憶體當中。
12.springboot使用redis的訂閱功能實現訊息佇列
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org
基於spring-redis釋出訂閱模式的實現
redis配置: Java程式碼 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
redis 釋出訂閱模式及應用場景
一:命令簡介 從redis手冊上面可以看到,其實“釋出、訂閱”模式才區區6個命令,下面聽我一一解說下哈~~~1. subscribeSUBSCRIBE channel [channel ...] 訂閱給定的一個或多個頻道的資訊。 從上面的官方解釋上來看,它的玩法有
redis釋出-訂閱
PUBLISH PUBLISH channel message 將資訊 message 傳送到指定的頻道 channel 。 可用版本: >= 2.0.0 時間複雜度: O(N+M)
Redis釋出訂閱和應用場景
Redis 釋出訂閱架構 Redis提供了釋出訂閱功能,可以用於訊息的傳輸,Redis的釋出訂閱機制包括三個部分,釋出者,訂閱者和Channel。 釋出者和訂閱者都是Redis客戶端