網(wǎng)站首頁 編程語言 正文
一、什么是發(fā)布和訂閱
- Redis 發(fā)布訂閱 (pub/sub) 是一種
消息通信模式
:發(fā)送者 (pub) 發(fā)送消息,訂閱者 (sub) 接收消息。 -
特點(diǎn):
Redis 客戶端可以訂閱任意數(shù)量的頻道。 - 這就好比粉絲們關(guān)注了我,當(dāng)我寫完文章發(fā)布的時候,你們打開CSDN也會接收到我寫的文章。此時,我就是發(fā)送者(pub);粉絲們就是訂閱者(sub)。
結(jié)構(gòu)圖如下:發(fā)布者發(fā)送自己的消息到redis服務(wù)器,訂閱者從redis服務(wù)器中獲取發(fā)布者發(fā)布的消息
二、Redis的發(fā)布和訂閱
為了方便后面講解發(fā)布和訂閱命令行的使用,我先用兩張圖簡單的介紹redis實(shí)現(xiàn)發(fā)布和訂閱的整體流程。
客戶端可以訂閱頻道如下圖:
當(dāng)給這個頻道發(fā)布消息后,消息就會發(fā)送給訂閱的客戶端,如下圖:
三、redis 發(fā)布訂閱常用命令
下表列出了 redis 發(fā)布訂閱常用命令:
四、命令實(shí)戰(zhàn)
在演示redis消息的發(fā)布和訂閱之前,我們需要打開兩個客戶端,一個充當(dāng)消息發(fā)布者,一個充當(dāng)消息接受者。
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
頻道發(fā)送消息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
發(fā)布者在兩個頻道發(fā)布消息:
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
發(fā)布者在三條頻道發(fā)送消息:
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
在發(fā)布者客戶端顯示活躍的頻道:
127.0.0.1:6379> PUBSUB channels 1) "csdn_one" 2) "csdn_two"
五、發(fā)布訂閱原理
每個Redis服務(wù)器進(jìn)程都維持著一個表示服務(wù)器狀態(tài)的redis.h
/redisServer
結(jié)構(gòu), 結(jié)構(gòu)的pubsub_channels
屬性是一個字典, 這個字典就用于保存訂閱頻道的信息,其中,字典的鍵為正在被訂閱的頻道
, 而字典的值則是一個鏈表, 鏈表中保存了所有訂閱這個頻道的客戶端
。
1、訂閱頻道原理
假設(shè)訂閱頻道前有如下圖所示的頻道和訂閱該頻道的客戶端:從圖中可以清楚的知道,channelA頻道有三個人訂閱;channelB頻道沒有人訂閱;channelC頻道有兩個人訂閱。
當(dāng)客戶端clientF
調(diào)用SUBSCRIBE
命令時,程序就將客戶端和要訂閱的頻道在 pubsub_channels
字典中關(guān)聯(lián)起來。執(zhí)行以下指令,對應(yīng)的結(jié)果圖為:
127.0.0.1:6379> SUBSCRIBE channelB channelC channelA
結(jié)論:通過pubsub_channels
字典, 程序只要檢查某個頻道是否為字典的鍵,就可以知道該頻道是否正在被客戶端訂閱; 只要取出某個鍵的值, 就可以得到所有訂閱該頻道的客戶端的信息。
2、發(fā)布信息原理
原理說明:
當(dāng)調(diào)用PUBLISH channel message
命令, 程序首先根據(jù)channel
定位到字典的鍵, 然后將信息發(fā)送給字典值鏈表中的所有客戶端。
對于上圖來說,如果客戶端channelA執(zhí)行命令PUBLISH channelA “hello,cabbage”,那么clientA
,clientB
,clientC
,clientF
這四個客戶端都將接收到"hello,cabbage"信息,通過遍歷訂閱頻道的所有客戶端。
3、退訂信息原理
原理:
使用UNSUBSCRIBE
命令可以退訂指定的頻道,這個命令執(zhí)行的是訂閱的反操作: 它從pubsub_channels
字典的給定頻道(鍵)中, 刪除關(guān)于當(dāng)前客戶端的信息, 這樣被退訂頻道的信息就不會再發(fā)送給這個客戶端。
參考文章:http://t.zoukankan.com/rxbook-p-12652198.html
原文鏈接:https://blog.csdn.net/weixin_59654772/article/details/125696877
相關(guān)推薦
- 2022-06-06 解決Unity無限滾動復(fù)用列表的問題_C#教程
- 2022-10-16 詳解C語言中結(jié)構(gòu)體(struct)的用法_C 語言
- 2023-03-05 Golang中tinyrpc框架的源碼解讀詳解_Golang
- 2022-04-18 python?如何使用requests下載文件_python
- 2022-09-25 Linux系統(tǒng)CentOS的本地host查詢
- 2022-11-12 C++設(shè)計(jì)與實(shí)現(xiàn)ORM系統(tǒng)實(shí)例詳解_C 語言
- 2022-02-24 C語言數(shù)據(jù)結(jié)構(gòu)與算法之排序總結(jié)(一)_C 語言
- 2022-07-08 C#四種計(jì)時器Timer的區(qū)別和用法_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支