国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

redis發(fā)布訂閱模型

這篇具有很好參考價(jià)值的文章主要介紹了redis發(fā)布訂閱模型。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

發(fā)布與訂閱

Redis的發(fā)布訂閱基于publish,subscribe,psubscribe

訂閱

subscribe "news.it"

發(fā)布

publish "news.it" "hello"

訂閱

redis發(fā)布訂閱模型,redis,bootstrap,javascript

發(fā)布

redis發(fā)布訂閱模型,redis,bootstrap,javascript

訂閱的狀態(tài)的推進(jìn)

redis發(fā)布訂閱模型,redis,bootstrap,javascript

new.it發(fā)送消息

redis發(fā)布訂閱模型,redis,bootstrap,javascript

1.頻道訂閱和退訂

Redis訂閱關(guān)系保存在服務(wù)器狀態(tài)的pubsub_channels字典

keychannel, value為鏈表,鏈表上有訂閱該頻道的Client

struct redisServer{
  //...
  
  //保存頻道的訂閱關(guān)系
  
  dict *pubsub_channels
  //...
}

如圖所示

redis發(fā)布訂閱模型,redis,bootstrap,javascript

1.1訂閱頻道subscribe

Client訂閱pubsub_channels有兩種情況

  • 頻道有其他訂閱者,把value添加到鏈表尾部
  • 沒有訂閱者,就把先創(chuàng)建key再添加value
subscribe "news.sport" "news.movie"

redis發(fā)布訂閱模型,redis,bootstrap,javascript

偽代碼
def subscribe (*all input channels):
	# 遍歷輸入的所有頻道
	for channel in all input channels:
		# 如果channel 不存在于pubsub channels 字典(沒有任何訂間者)
		# 那么在宇典中添加channel 鍵,井設(shè)置它的值為空鏈表
		if channel not in server.pubsub channels:
			server.pubsub channels [channel) = (1
		# 將訂閱者添加到頻道所對(duì)應(yīng)的鏈表的未尾
		server.pubsub channels [channel].append (client)
1.2 退訂頻道
unsubscribe "news.sport"  "news.movie"

redis發(fā)布訂閱模型,redis,bootstrap,javascript

偽代碼
def unsubscribe (*all input channels):
		#遍歷要退訂的所有頻道
		for channel in all input channels :
			# 在訂閱者鏈表中副除退訂的客戶端
			server . pubsub channels [channel1. remove (client)
			# 如果頻道已經(jīng)沒有任何訂閱者了(訂間者鏈表為空)
			# 那么將頻道從字典中刷除
			if len (server.pubsub channels [channel]) == 0 :
				server.pubsub channels. remove (channel)

2.模式訂閱和退訂

struct redisServer{
  // ...
  //保持所有模式訂閱關(guān)系
  list *pubsub_patterns;
  // ...
}

pubsub_patterns是鏈表,每個(gè)節(jié)點(diǎn)都包括一個(gè)pubsub_Patterns結(jié)構(gòu)

typedef struct pubsubPattern{
  //訂閱模式Client
  redisClient *client;
  //被訂閱的模式
  robj *pattern;
}

示意圖

redis發(fā)布訂閱模型,redis,bootstrap,javascript

client-7,8,9分別在訂閱 music.*,book.*,news.*

redis發(fā)布訂閱模型,redis,bootstrap,javascript

2.1訂閱模式psubscribe

客戶端執(zhí)行psubscribe,服務(wù)端會(huì)執(zhí)行兩個(gè)操作

  1. 新建pubsubPattern,講結(jié)構(gòu)的pattern設(shè)置為被訂閱的模式
  2. pubsubPattern添加到pubsub_patterns鏈表尾部

redis發(fā)布訂閱模型,redis,bootstrap,javascript

執(zhí)行psubscribe之前的pubsub_patterns

redis發(fā)布訂閱模型,redis,bootstrap,javascript

執(zhí)行psubscribe之后的pubsub_patterns

def subscribe (*all_ input patterns):
 #遍歷輸入的所有模式
	for pattern in all input patterns:
		#創(chuàng)建新的 pubsubPattern 結(jié)構(gòu)
   # 記錄被訂間的模式,以及訂閱模式的容戶端
   pubsubPattern = create new pubsubPattern (
   pubsubPattern.client= client
   pubsubPattern.pattern= pattern
   # 將新的 pubsubPattern 追加到pubsubpatterns鏈表末尾
   server.pubsub patterns.append (pubsubPattern)
2.2 退訂模式

punsubscribe

redis發(fā)布訂閱模型,redis,bootstrap,javascript

當(dāng)執(zhí)行退訂模式的時(shí)候,相應(yīng)的pubsubPattern結(jié)構(gòu)會(huì)被刪除

執(zhí)行punsubscribe "news.*"之前的pubsub_patterns

redis發(fā)布訂閱模型,redis,bootstrap,javascript

執(zhí)行punsubscribe "news.*"之后的pubsub_patterns

redis發(fā)布訂閱模型,redis,bootstrap,javascript

def unsubscribe (*all input patterns) :
		# 遍歷所有要退訂的模式
		for pattern in all input patterns:
				# 遍歷 pubsub patterns 鏈表中的所有pubsubPattern 結(jié)構(gòu)
				for pubsubPattern in server.pubsub patterns:
							#如果當(dāng)前客戶端和pubsuibPattern 記錄的客戶端相同
							#并且要退訂的模式也和 pubsubPattern 記錄的模式相同
							if client == pubsubPattern.client and \
								pattern == pubsubPattern.pattern:
                # 那么將這個(gè)pubsubPattern 從鏈表中利除
                server.pubsub patterns.remove (pubsubPattern)

3.發(fā)送消息

PUBLISH <channel> <message>

message發(fā)送到channel的訂閱者

一個(gè)或多個(gè)pattern與頻道channel匹配

3.1 消息發(fā)送頻道訂閱者

redis發(fā)布訂閱模型,redis,bootstrap,javascript

PUBLISH "news.it" "hello"		// client-1,client-2,client-3都會(huì)收到
偽代碼
def channel_publish (channel, message) :
# 如果 channel鍵不存在于pubsub channels 字典中
# 那么說明 channe1 頻道沒有任何訂鬩者
# 程序不做發(fā)送動(dòng)作,直接返回
if channel not in server.pubsub channels:
	return
    
# 運(yùn)行到這里,說明 channel 頻道至少有一個(gè)訂閱者
# 程序遍歷 channe1 頻道的訂閱者鏈表
# 將消,息發(fā)送給所有訂閱者
for subscriber in server.pubsub channels [channel] :
	send message (subscriber, message)
3.2消息發(fā)送模式訂閱者

redis發(fā)布訂閱模型,redis,bootstrap,javascript

PUBLISH "news.it" "hello"		// 和news.*匹配,news.*會(huì)收到
偽代碼
def pattern_publish (channel, message):
	# 遍歷所有模式訂閱消息
	for pubsubPattern in server.pubsub patterns:
		# 如果頻道和模式相匹配
		if match (channel, pubsubPattern.pattern):
			#那么格消息發(fā)洪給訂回該模式的容戶瑞
			send message (pubsubPattern.client, message)

總結(jié)的Publish

def publish (channel, message):
		# 將消息發(fā)送給 channe1 頻道的所有訂間者
		channel publish (channel, message)
				#將消息發(fā)送給所有和 channel 頻道相匹配的模式的訂回者
				pattern publish (channel, message)

4.查看訂閱消息

PUBSUB查看頻道或者模式相關(guān)消息

4.1 pubsub channels
pubsub channels <pattern>(可選)  //pattern可選,選擇表示返回匹配的頻道
def pubsub channels (pattern=None) :
	#一個(gè)列表,用于記錄所有符合條件的頻道
	channel_list = []
    
	# 遍歷服務(wù)器中的所有頻道
	#(也即是pubsub channels 字典的所有鍵)
	for channel in server.pubsub channels:
		# 當(dāng)以下兩個(gè)條件的任意一個(gè)滿足時(shí),將頻道添加到鏈表里面:
		#1 )用戶沒有指定pattezn 參數(shù)
		#2 )用戶指定了pattern 參數(shù),并且channel 和pattern 匹配
		if (pattern is None) or match (channel, pattern):
		channel list.append (channel)
# 向客戶端返回頻道列表
return channel_list      

redis發(fā)布訂閱模型,redis,bootstrap,javascript

被訂閱的4個(gè)頻道

redis> PUBSUB CHANNELS
1)"news. it"
2)"news.sport"
3)"news. business"
4)"news.movie"

進(jìn)行頻道pattern篩選

redis> PUBSUB CHANNELS "news. [is]*"	
  //返回所有名稱以"news."開頭,并且后面緊跟著一個(gè)或多個(gè)字母"i"或"s"的頻道的列表
1)"news.it"
2)"news. sport"
4.2 pubsub numsub
pubsub numsub [channel-1 channel-2 ...channel-n]  //接受多個(gè)頻道作為入?yún)?,返回這些頻道的訂閱者
偽代碼
def pubsub numsub (*all input channels) :
	# 遍歷輸入的所有頻道
	for channel in all input channels:
		#如果 pubsub channels 宇典中沒有 channe1 這個(gè)鍵
		#那么說明 channel 頻道沒有任何訂回者
		if channel not in server.pubsub channels:
			#返回頻道名
      reply channel name (channel)
      # 訂閱者數(shù)量為。
      reply subscribe count (0)
#如果 pubsub channels 字典中存在 channe1 鍵
# 那么說明channel 頻道至少有一個(gè)訂閱者
else:
      #返回頻道名
      reply channel name (channel)
      # 訂閱者鏈表的長(zhǎng)度就是訂用者數(shù)量
      reply subscribe count (len (server .pubsub_channels [channel]))

redis發(fā)布訂閱模型,redis,bootstrap,javascript

redis> PUBSUB NUMSUB news.it news.sport news.business news.movie
1)"news. it"
2)"3"
3)"news. sport"
4)"2"
5)"news.business"
6)"2"
7)"news. movie"
8)"1"
4.3 pubsub numpat

返回服務(wù)器當(dāng)前被訂閱模式的數(shù)量

偽代碼
def pubsub_numpat():
		# pubsub_patterns 鏈表長(zhǎng)度是被訂閱數(shù)量
reply pattern count (len(server.pubsub patterns))

redis發(fā)布訂閱模型,redis,bootstrap,javascript

對(duì)于上方鏈表來說,執(zhí)行pubsub numpat結(jié)果文章來源地址http://www.zghlxwxcb.cn/news/detail-635750.html

redis> pubsub numpat
(integer) 3

5.回顧

  1. 服務(wù)器在pubsub_channels保存頻道訂閱關(guān)系,subscribeunsubscribe
  2. 服務(wù)器在pubsub_patterns保存模式訂閱關(guān)系,psubscribepunsubscribe
  3. publish發(fā)送消息
  4. pubsub讀取pubsub_channelspubsub_patterns來實(shí)現(xiàn)

到了這里,關(guān)于redis發(fā)布訂閱模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JAVA 實(shí)現(xiàn) Redis 發(fā)布訂閱

    JAVA 實(shí)現(xiàn) Redis 發(fā)布訂閱

    發(fā)布訂閱: 消息發(fā)布者發(fā)布消息 和 消息訂閱者接收消息 ,兩者之間通過某種媒介聯(lián)系起來 例如訂雜志,當(dāng)自己訂閱了愛格雜志,每個(gè)月會(huì)發(fā)刊一本。到發(fā)布的時(shí)候派送員將雜志送到自己手上就能看到雜志內(nèi)容。只有我們訂閱了該雜志才會(huì)派送給我們 Redis 發(fā)布訂閱(pub/su

    2024年02月14日
    瀏覽(19)
  • redis發(fā)布訂閱模式的應(yīng)用

    小體量系統(tǒng),某些特定場(chǎng)景需要做異步處理。如操作日志記錄、發(fā)送消息、數(shù)據(jù)excel導(dǎo)入等。并發(fā)量不大,主要作用是異步批處理數(shù)據(jù),提高響應(yīng)速度,改善用戶體驗(yàn),不至于頁面卡半天。用消息隊(duì)列的話顯得很笨重,牛刀殺雞,不利于項(xiàng)目的快速布署和影響項(xiàng)目穩(wěn)定。在這

    2024年02月11日
    瀏覽(17)
  • Redis 消息隊(duì)列和發(fā)布訂閱

    Redis 消息隊(duì)列和發(fā)布訂閱

    采用redis 三種方案: ● 生產(chǎn)者消費(fèi)者:一個(gè)消息只能有一個(gè)消費(fèi)者 ● 發(fā)布者訂閱者:一個(gè)消息可以被多個(gè)消費(fèi)者收到 ● stream模式:實(shí)現(xiàn)隊(duì)列和廣播模式 Producer調(diào)用redis的lpush往特定key里放消息,Consumer調(diào)用brpop去不斷監(jiān)聽key。 1、利用redis的鏈表,存儲(chǔ)數(shù)據(jù),實(shí)現(xiàn)隊(duì)列模式

    2024年01月18日
    瀏覽(21)
  • JavaScript 簡(jiǎn)單實(shí)現(xiàn)觀察者模式和發(fā)布-訂閱模式

    JavaScript 簡(jiǎn)單實(shí)現(xiàn)觀察者模式和發(fā)布-訂閱模式

    大家好,我是南木元元,熱衷分享有趣實(shí)用的文章。今天來聊聊設(shè)計(jì)模式中常用的觀察者模式和發(fā)布-訂閱模式。 觀察者模式定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都將得到通知。 如何理解這句話呢?來舉個(gè)生活中的例子

    2024年02月12日
    瀏覽(638)
  • Redis實(shí)現(xiàn)消息的發(fā)布和訂閱

    4.1 發(fā)送消息 4.2 接收消息

    2024年02月13日
    瀏覽(19)
  • 【Redis】Pub/Sub(發(fā)布/訂閱)

    【Redis】Pub/Sub(發(fā)布/訂閱)

    Pub/Sub(發(fā)布/訂閱)是一種消息傳遞模式,其中消息發(fā)送者(發(fā)布者)將消息發(fā)布到一個(gè)或多個(gè)主題(topics)或頻道(channels),而消息接收者(訂閱者)訂閱特定的主題或頻道以接收消息。 在Pub/Sub模式中,發(fā)布者和訂閱者不直接通信,而是通過一個(gè)中介(通常稱為消息代理

    2024年02月16日
    瀏覽(18)
  • Redis消息傳遞:發(fā)布訂閱模式詳解

    Redis消息傳遞:發(fā)布訂閱模式詳解

    目錄 1.Redis發(fā)布訂閱簡(jiǎn)介 2.發(fā)布/訂閱使用 ? ?2.1?基于頻道(Channel)的發(fā)布/訂閱 ? ?2.2?基于模式(pattern)的發(fā)布/訂閱 3.深入理解Redis的訂閱發(fā)布機(jī)制 ? ?3.1?基于頻道(Channel)的發(fā)布/訂閱如何實(shí)現(xiàn)的? ? ?3.2?基于模式(Pattern)的發(fā)布/訂閱如何實(shí)現(xiàn)的? ? ?3.3?SpringBoot結(jié)合Redis發(fā)布

    2024年02月12日
    瀏覽(19)
  • JavaScript設(shè)計(jì)模式(五)——發(fā)布訂閱模式、橋接模式、組合模式

    JavaScript設(shè)計(jì)模式(五)——發(fā)布訂閱模式、橋接模式、組合模式

    個(gè)人簡(jiǎn)介 ?? 個(gè)人主頁: 前端雜貨鋪 ???♂? 學(xué)習(xí)方向: 主攻前端方向,正逐漸往全干發(fā)展 ?? 個(gè)人狀態(tài): 研發(fā)工程師,現(xiàn)效力于中國工業(yè)軟件事業(yè) ?? 人生格言: 積跬步至千里,積小流成江海 ?? 推薦學(xué)習(xí):??前端面試寶典 ??Vue2 ??Vue3 ??Vue2/3項(xiàng)目實(shí)戰(zhàn) ??Node.js??

    2024年02月09日
    瀏覽(98)
  • Redis發(fā)布訂閱機(jī)制學(xué)習(xí)|kafka相關(guān)經(jīng)驗(yàn)

    Redis 鍵值數(shù)據(jù)庫 key value NoSql 第一章: 差異 #1 structured 結(jié)構(gòu)化 約束 primary unique unsigned #2 relational 關(guān)聯(lián)的 #3 SQL查詢 例 select id, name, age from tb_user where id=1 redis get user:1 mongoDB db.users.find({_id: 1}) elasticsearch GET http://localhost:9200/users/1 #4 事務(wù) ACID 基本一致 無事務(wù) 鍵值類型 Redis 文檔類

    2024年02月15日
    瀏覽(26)
  • Redis(發(fā)布訂閱、事務(wù)、redis整合springboot、集成 Spring Cache)

    Redis(發(fā)布訂閱、事務(wù)、redis整合springboot、集成 Spring Cache)

    目錄 一.redis的發(fā)布訂閱 1、什么 是發(fā)布和訂閱 2、Redis的發(fā)布和訂閱 3、發(fā)布訂閱的代碼實(shí)現(xiàn) 二.Redis事務(wù) 1.事務(wù)簡(jiǎn)介 1、在事務(wù)執(zhí)行之前 如果監(jiān)聽的key的值有變化就不能執(zhí)行 2、在事務(wù)執(zhí)行之前 如果監(jiān)聽的key的值沒有變化就能執(zhí)行 3、Exec之前就出現(xiàn)錯(cuò)誤 4、Exec之后出現(xiàn)的錯(cuò)誤

    2024年01月24日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包