亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Redis實(shí)現(xiàn)消息的發(fā)布訂閱原理分析

 更新時(shí)間:2022年07月25日 10:53:17   作者:我是一棵卷心菜  
本文主要介紹了Redis實(shí)現(xiàn)消息的發(fā)布訂閱原理分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、什么是發(fā)布和訂閱

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

結(jié)構(gòu)圖如下:發(fā)布者發(fā)送自己的消息到redis服務(wù)器,訂閱者從redis服務(wù)器中獲取發(fā)布者發(fā)布的消息

在這里插入圖片描述

二、Redis的發(fā)布和訂閱

為了方便后面講解發(fā)布和訂閱命令行的使用,我先用兩張圖簡(jiǎn)單的介紹redis實(shí)現(xiàn)發(fā)布和訂閱的整體流程。

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

在這里插入圖片描述

當(dāng)給這個(gè)頻道發(fā)布消息后,消息就會(huì)發(fā)送給訂閱的客戶端,如下圖:

在這里插入圖片描述

三、redis 發(fā)布訂閱常用命令

下表列出了 redis 發(fā)布訂閱常用命令:

在這里插入圖片描述

四、命令實(shí)戰(zhàn)

在演示redis消息的發(fā)布和訂閱之前,我們需要打開(kāi)兩個(gè)客戶端,一個(gè)充當(dāng)消息發(fā)布者,一個(gè)充當(dāng)消息接受者。

1、基本使用

先用一個(gè)客戶端訂閱頻道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

接著一個(gè)客戶端在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開(kāi)頭的頻道,*表示任意字符

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

發(fā)布者在兩個(gè)頻道發(fā)布消息:

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

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

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ā)布訂閱原理

每個(gè)Redis服務(wù)器進(jìn)程都維持著一個(gè)表示服務(wù)器狀態(tài)的redis.h/redisServer 結(jié)構(gòu), 結(jié)構(gòu)的pubsub_channels屬性是一個(gè)字典, 這個(gè)字典就用于保存訂閱頻道的信息,其中,字典的鍵為正在被訂閱的頻道, 而字典的值則是一個(gè)鏈表, 鏈表中保存了所有訂閱這個(gè)頻道的客戶端。

1、訂閱頻道原理

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

在這里插入圖片描述

當(dāng)客戶端clientF調(diào)用SUBSCRIBE命令時(shí),程序就將客戶端和要訂閱的頻道在 pubsub_channels字典中關(guān)聯(lián)起來(lái)。執(zhí)行以下指令,對(duì)應(yīng)的結(jié)果圖為:

127.0.0.1:6379> SUBSCRIBE channelB channelC channelA

在這里插入圖片描述

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

2、發(fā)布信息原理

原理說(shuō)明:當(dāng)調(diào)用PUBLISH channel message命令, 程序首先根據(jù)channel定位到字典的鍵, 然后將信息發(fā)送給字典值鏈表中的所有客戶端。

對(duì)于上圖來(lái)說(shuō),如果客戶端channelA執(zhí)行命令PUBLISH channelA “hello,cabbage”,那么clientA,clientB,clientC,clientF這四個(gè)客戶端都將接收到"hello,cabbage"信息,通過(guò)遍歷訂閱頻道的所有客戶端。

3、退訂信息原理

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

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

到此這篇關(guān)于Redis實(shí)現(xiàn)消息的發(fā)布訂閱的文章就介紹到這了,更多相關(guān)Redis 消息發(fā)布訂閱內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 生產(chǎn)redisson延時(shí)隊(duì)列不消費(fèi)問(wèn)題排查解決

    生產(chǎn)redisson延時(shí)隊(duì)列不消費(fèi)問(wèn)題排查解決

    這篇文章主要為大家介紹了生產(chǎn)redisson延時(shí)隊(duì)列不消費(fèi)問(wèn)題排查解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Redis Value過(guò)大問(wèn)題(鍵值過(guò)大)

    Redis Value過(guò)大問(wèn)題(鍵值過(guò)大)

    這篇文章主要介紹了Redis Value過(guò)大問(wèn)題(鍵值過(guò)大),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Redis實(shí)現(xiàn)登錄注冊(cè)的示例代碼

    Redis實(shí)現(xiàn)登錄注冊(cè)的示例代碼

    本文主要介紹了Redis實(shí)現(xiàn)登錄注冊(cè)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • dubbo服務(wù)使用redis注冊(cè)中心的系列異常解決

    dubbo服務(wù)使用redis注冊(cè)中心的系列異常解決

    這篇文章主要為大家介紹了dubbo服務(wù)在使用redis注冊(cè)中心遇到的一系列異常的解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • redis分布式鎖的8大坑總結(jié)梳理

    redis分布式鎖的8大坑總結(jié)梳理

    這篇文章主要介紹了redis分布式鎖的8大坑總結(jié)梳理,使用redis的分布式鎖,我們首先想到的可能是setNx命令,文章圍繞setNx命令展開(kāi)詳細(xì)的內(nèi)容介紹,感興趣的小伙伴可以參考一下
    2022-07-07
  • 一文教你學(xué)會(huì)Redis的事務(wù)

    一文教你學(xué)會(huì)Redis的事務(wù)

    Redis?作為內(nèi)存的存儲(chǔ)中間件,已經(jīng)是面試的面試題必問(wèn)之一了。今天小編就來(lái)和大家一起來(lái)聊聊Redis的事務(wù)吧,希望對(duì)大家有所幫助
    2022-08-08
  • Redis持久化AOF示例詳解

    Redis持久化AOF示例詳解

    AOF(Append-Only?File)用于將Redis服務(wù)器收到的寫操作追加到日志文件,通過(guò)該機(jī)制可以保證服務(wù)器重啟后依然可以依靠日志文件恢復(fù)數(shù)據(jù),這篇文章主要介紹了Redis持久化AOF詳解,需要的朋友可以參考下
    2023-12-12
  • Redis數(shù)據(jù)類型之散列類型hash命令學(xué)習(xí)

    Redis數(shù)據(jù)類型之散列類型hash命令學(xué)習(xí)

    這篇文章主要為大家介紹了Redis數(shù)據(jù)類型之散列類型hash命令學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Redis exists命令bug分析(案例詳解)

    Redis exists命令bug分析(案例詳解)

    Redis EXISTS 命令用于檢查給定 key 是否存在,本文重點(diǎn)給大家介紹Redis exists命令bug分析,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • Redis分布式鎖python-redis-lock使用方法

    Redis分布式鎖python-redis-lock使用方法

    這篇文章主要介紹了Redis分布式鎖python-redis-lock使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論