日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Redis實現消息的發布訂閱原理分析_Redis

作者:我是一棵卷心菜 ? 更新時間: 2022-09-17 編程語言

一、什么是發布和訂閱

  • Redis 發布訂閱 (pub/sub) 是一種消息通信模式:發送者 (pub) 發送消息,訂閱者 (sub) 接收消息。
  • 特點:Redis 客戶端可以訂閱任意數量的頻道。
  • 這就好比粉絲們關注了我,當我寫完文章發布的時候,你們打開CSDN也會接收到我寫的文章。此時,我就是發送者(pub);粉絲們就是訂閱者(sub)。

結構圖如下:發布者發送自己的消息到redis服務器,訂閱者從redis服務器中獲取發布者發布的消息

在這里插入圖片描述

二、Redis的發布和訂閱

為了方便后面講解發布和訂閱命令行的使用,我先用兩張圖簡單的介紹redis實現發布和訂閱的整體流程。

客戶端可以訂閱頻道如下圖:

在這里插入圖片描述

當給這個頻道發布消息后,消息就會發送給訂閱的客戶端,如下圖:

在這里插入圖片描述

三、redis 發布訂閱常用命令

下表列出了 redis 發布訂閱常用命令:

在這里插入圖片描述

四、命令實戰

在演示redis消息的發布和訂閱之前,我們需要打開兩個客戶端,一個充當消息發布者,一個充當消息接受者。

1、基本使用

先用一個客戶端訂閱頻道csdn_blog,等待消息:

127.0.0.1:6379> SUBSCRIBE csdn_blog 
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "csdn_blog"
3) (integer) 1

接著一個客戶端在csdn_blog頻道發送消息hello,cabbage

127.0.0.1:6379> PUBLISH csdn_blog "hello,cabbage"
(integer) 1

最后接受者接收到消息:

1) "message"?
2) "csdn_blog" ? ?# 接收消息所在的頻道
3) "hello,cabbage" ? # 接收到的消息

2、訂閱符合要求的頻道

訂閱以csdn開頭的頻道,*表示任意字符

127.0.0.1:6379> PSUBSCRIBE csdn*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "csdn*"
3) (integer) 1

發布者在兩個頻道發布消息:

127.0.0.1:6379> PUBLISH csdn_blog "hello"
(integer) 1
127.0.0.1:6379> PUBLISH csdn_sing "sing"
(integer) 1

最后訂閱者接收到兩個頻道的消息:

1) "pmessage"
2) "csdn*"
3) "csdn_blog"
4) "hello"
1) "pmessage"
2) "csdn*"
3) "csdn_sing"
4) "sing"

3、查看活躍頻道

訂閱者訂閱兩條頻道:

127.0.0.1:6379> SUBSCRIBE csdn_one csdn_two
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "csdn_one"
3) (integer) 1
1) "subscribe"
2) "csdn_two"
3) (integer) 2

發布者在三條頻道發送消息:

127.0.0.1:6379> PUBLISH csdn_one "one"
(integer) 1
127.0.0.1:6379> PUBLISH csdn_two "two"
(integer) 1
127.0.0.1:6379> PUBLISH csdn_three "three"
(integer) 0

在發布者客戶端顯示活躍的頻道:

127.0.0.1:6379> PUBSUB channels
1) "csdn_one"
2) "csdn_two"

五、發布訂閱原理

每個Redis服務器進程都維持著一個表示服務器狀態的redis.h/redisServer 結構, 結構的pubsub_channels屬性是一個字典, 這個字典就用于保存訂閱頻道的信息,其中,字典的鍵為正在被訂閱的頻道, 而字典的值則是一個鏈表, 鏈表中保存了所有訂閱這個頻道的客戶端

1、訂閱頻道原理

假設訂閱頻道前有如下圖所示的頻道和訂閱該頻道的客戶端:從圖中可以清楚的知道,channelA頻道有三個人訂閱;channelB頻道沒有人訂閱;channelC頻道有兩個人訂閱。

在這里插入圖片描述

當客戶端clientF調用SUBSCRIBE命令時,程序就將客戶端和要訂閱的頻道在 pubsub_channels字典中關聯起來。執行以下指令,對應的結果圖為:

127.0.0.1:6379> SUBSCRIBE channelB channelC channelA

在這里插入圖片描述

結論:通過pubsub_channels字典, 程序只要檢查某個頻道是否為字典的鍵,就可以知道該頻道是否正在被客戶端訂閱; 只要取出某個鍵的值, 就可以得到所有訂閱該頻道的客戶端的信息。

2、發布信息原理

原理說明:當調用PUBLISH channel message命令, 程序首先根據channel定位到字典的鍵, 然后將信息發送給字典值鏈表中的所有客戶端。

對于上圖來說,如果客戶端channelA執行命令PUBLISH channelA “hello,cabbage”,那么clientAclientBclientCclientF這四個客戶端都將接收到"hello,cabbage"信息,通過遍歷訂閱頻道的所有客戶端。

3、退訂信息原理

原理:使用UNSUBSCRIBE命令可以退訂指定的頻道,這個命令執行的是訂閱的反操作: 它從pubsub_channels字典的給定頻道(鍵)中, 刪除關于當前客戶端的信息, 這樣被退訂頻道的信息就不會再發送給這個客戶端。

參考文章:http://t.zoukankan.com/rxbook-p-12652198.html

原文鏈接:https://blog.csdn.net/weixin_59654772/article/details/125696877

欄目分類
最近更新