摘要:上一篇文章實(shí)戰(zhàn)第三章命令第五節(jié)有序集合下一篇文章實(shí)戰(zhàn)第三章命令第七節(jié)其他命令一般來說,發(fā)布與訂閱又稱的特點(diǎn)是訂閱者負(fù)責(zé)訂閱頻道,發(fā)送者負(fù)責(zé)向頻道發(fā)送二進(jìn)制字符串消息。到目前為止,本書介紹的大多數(shù)命令都是與特定數(shù)據(jù)類型相關(guān)的。
上一篇文章:Python--Redis實(shí)戰(zhàn):第三章:Redis命令:第五節(jié):有序集合
下一篇文章:Python--Redis實(shí)戰(zhàn):第三章:Redis命令:第七節(jié):其他命令
一般來說,發(fā)布與訂閱(又稱pub/sub)的特點(diǎn)是訂閱者(listener)負(fù)責(zé)訂閱頻道(channel),發(fā)送者(publisher)負(fù)責(zé)向頻道發(fā)送二進(jìn)制字符串消息(binary string message)。每當(dāng)有消息被發(fā)送至給定頻道時(shí),頻道的所有訂閱者都會收到消息。我們也可以把頻道看作是電臺,其中訂閱者可以同時(shí)收聽多個電臺,而發(fā)送者則可以在任何電臺發(fā)送信息。
本節(jié)將對發(fā)布與訂閱的相關(guān)操作進(jìn)行介紹,閱讀這一節(jié)可以讓讀者學(xué)會怎樣使用發(fā)布與訂閱的相關(guān)命令,并了解到為什么本書在之后的章節(jié)里面會使用其他相似的解決方案來代替Redis提供的發(fā)布與訂閱。
下表展示了Redis提供的5個發(fā)布與訂閱命令:
命令 | 用例 | 用例描述 |
---|---|---|
subscribe | subscribe channel [channel ...] | 訂閱給定的一個或多個頻道 |
unsubscribe | unsubscribe [channnel channel ...] | 退訂給定的一個或多個頻道,如果執(zhí)行時(shí)沒有給定任何頻道,那么退訂所有頻道 |
publish | publish channel message | 向給定頻道發(fā)送消息 |
psubscribe | psubscribe pattern [pattern ...] | 訂閱與給定模式相匹配的所有頻道 |
punsunscribe | punsunscribe [pattern [pattern ...]] | 退訂給定的模式,如果執(zhí)行時(shí)沒有給定任何模式,那么退訂所有模式。 |
考慮到publish命令和subscribe命令在Python客戶端的實(shí)現(xiàn)方式,一個比較簡單的演示發(fā)布與訂閱的方法,就像下面代碼清單那樣使用輔助線程(helper thread)來執(zhí)行publish命令:
import redis # 導(dǎo)入redis包包 import time,threading # 與本地redis進(jìn)行鏈接,地址為:localhost,端口號為6379 r = redis.StrictRedis(host="localhost", port=6379) def publisher(n): #函數(shù)在開始執(zhí)行時(shí)會先休眠,讓訂閱者有足夠的時(shí)間來連接服務(wù)器并監(jiān)聽消息 time.sleep(1) for i in range(n): r.publish("channel",i) #在發(fā)送消息之后進(jìn)行短暫的休眠,讓消息可以一條接一條地出現(xiàn) time.sleep(1) def run_pubsub(): #啟動發(fā)送者線程,并讓它發(fā)送三條消息 threading.Thread(target=publisher,args=(3,)).start() #創(chuàng)建訂閱對象,并對它訂閱給定的頻道 pubsub=r.pubsub() pubsub.subscribe(["channel"]) count=0 #通過遍歷函數(shù)pubsub.listen()的執(zhí)行結(jié)果來監(jiān)聽訂閱消息 for item in pubsub.listen(): #打印接收到的每條消息 print(item) count+=1 if count==4: pubsub.unsubscribe() if count==5: break if __name__ == "__main__": run_pubsub()
運(yùn)行結(jié)果:
{"type": "subscribe", "pattern": None, "channel": b"channel", "data": 1} {"type": "message", "pattern": None, "channel": b"channel", "data": b"0"} {"type": "message", "pattern": None, "channel": b"channel", "data": b"1"} {"type": "message", "pattern": None, "channel": b"channel", "data": b"2"} {"type": "unsubscribe", "pattern": None, "channel": b"channel", "data": 0}
在剛開始訂閱一個頻道的時(shí)候,客戶端會接收到一條關(guān)于被訂閱頻道的反饋。在退訂頻道時(shí),客戶端會接受到一條反饋信息,告知被退訂的是哪個頻道,以及客戶端目前仍在訂閱的頻道數(shù)量。
雖然Redis的發(fā)布與訂閱非常有用,但本書只在這一節(jié)和8.5節(jié)使用了這個模式,這樣做的原因主要有以下兩個:
第一個原因和Redis系統(tǒng)的穩(wěn)定性有關(guān)。對于舊版Redis來說,如果一個客戶端訂閱了某個或某些頻道,但它讀取消息的速度卻不夠快的話,那么不斷積壓的消息會使得Redis輸出緩沖區(qū)的體積變得越來越大,這可能會導(dǎo)致Redis的速度變慢,甚至直接崩潰。也可能會導(dǎo)致Redis被操作系統(tǒng)強(qiáng)制殺死,甚至導(dǎo)致操作系統(tǒng)本身不可用。新版的Redis不會出現(xiàn)這種問題,因?yàn)樗鼤詣訑嚅_不符合client-output-buffer-limit pubsub配置選項(xiàng)要求的訂閱客戶端。
第二個原因和數(shù)據(jù)傳輸?shù)目煽啃杂嘘P(guān)。任何網(wǎng)絡(luò)系統(tǒng)在執(zhí)行操作時(shí)都可能會遇到斷線情況,而斷線產(chǎn)生的連接錯誤通常會使得網(wǎng)絡(luò)連接兩端的其中一端進(jìn)行重新連接。本書使用的Python語言的Redis客戶端會在連接失效時(shí)自動進(jìn)程重新連接,也會自動處理連接池(connection pool),諸如此類。但是,如果客戶端在執(zhí)行訂閱操作的過程中斷線,那么客戶端將丟失在斷線期間發(fā)送的所有消息,因此依靠頻道來接受消息的用戶可能會對Redis提供的publish命令和subscribe命令的語義感到失望。
基于以上兩個原因,本書在第六章編寫了兩個不同的方法來實(shí)現(xiàn)可靠的消息傳遞操作,這兩個方法除了可以處理網(wǎng)絡(luò)斷線之外,還可以防止Redis因?yàn)橄D壓而耗費(fèi)過多內(nèi)存(這個方法即使對于舊版的Redis也是有效的)。
如果你喜歡簡單易用的publish命令和subscribe命令,并且能夠承擔(dān)可能會丟失一小部分?jǐn)?shù)據(jù)的風(fēng)險(xiǎn),那么你也可以繼續(xù)使用Redis提供的發(fā)布與訂閱特性,而不是8.5節(jié)中提供的實(shí)現(xiàn),只要記得先把client-output-buffer-limit pubsub選項(xiàng)設(shè)置好就行了。
到目前為止,本書介紹的大多數(shù)命令都是與特定數(shù)據(jù)類型相關(guān)的。接下來的一節(jié)要介紹的命令你可能也會用到,但它們既不屬于Redis提供的5中數(shù)據(jù)結(jié)構(gòu),也不屬于發(fā)布與訂閱特性。
上一篇文章:Python--Redis實(shí)戰(zhàn):第三章:Redis命令:第五節(jié):有序集合
下一篇文章:Python--Redis實(shí)戰(zhàn):第三章:Redis命令:第七節(jié):其他命令
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44898.html
摘要:對給定的有序集合執(zhí)行類似于集合的并集運(yùn)算。用戶可以把集合作為輸入傳給和,命令會將集合看作是成員分值全為的有序集合來處理。上一篇文章實(shí)戰(zhàn)第三章命令第四節(jié)散列下一篇文章實(shí)戰(zhàn)第三章命令第六節(jié)發(fā)布與訂閱 上一篇文章:Python--Redis實(shí)戰(zhàn):第三章:Redis命令:第四節(jié):散列下一篇文章:Python--Redis實(shí)戰(zhàn):第三章:Redis命令:第六節(jié):發(fā)布與訂閱 和散列存儲著鍵與值之間...
摘要:上一篇文章實(shí)戰(zhàn)第三章命令第六節(jié)發(fā)布與訂閱下一篇文章實(shí)戰(zhàn)第四章數(shù)據(jù)安全與性能保障第節(jié)持久化選項(xiàng)到目前為止,本章介紹了提供的種結(jié)構(gòu)以及的發(fā)布與訂閱模式。 上一篇文章:Python--Redis實(shí)戰(zhàn):第三章:Redis命令:第六節(jié):發(fā)布與訂閱下一篇文章:Python--Redis實(shí)戰(zhàn):第四章:數(shù)據(jù)安全與性能保障:第1節(jié):持久化選項(xiàng) 到目前為止,本章介紹了Redis提供的5種結(jié)構(gòu)以及Redi...
閱讀 1435·2021-09-22 15:52
閱讀 1480·2019-08-30 15:44
閱讀 905·2019-08-30 14:24
閱讀 2715·2019-08-30 13:06
閱讀 2710·2019-08-26 13:45
閱讀 2795·2019-08-26 13:43
閱讀 1027·2019-08-26 12:01
閱讀 1456·2019-08-26 11:56