1. 程式人生 > >Redis 釋出訂閱功能

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.newsit.blogit.tweets 等等), news.* 匹配所有以 news. 開頭的頻道( news.itnews.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-1channel-1 的訂閱者數量,頻道 channel-2channel-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 命令訂閱的所有模式都會被退訂。在這種情況下,命令會返回一個資訊,告知客戶端所有被退訂的模式

返回值:

這個命令在不同的客戶端中有不同的表現。

有關訂閱命令有兩點需要注意:

  • 客戶端在執行訂閱命令之後進入了訂閱狀態,只能接收 SUBSCRIBEPSUBSCRIBEUNSUBSCRIBEPUNSUBSCRIBE 四個命令。
  • 開啟的訂閱客戶端,無法收到該頻道之前的訊息,因為 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客戶端