成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python--Redis實(shí)戰(zhàn):第三章:Redis命令:第六節(jié):發(fā)布與訂閱

DC_er / 2514人閱讀

摘要:上一篇文章實(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

相關(guān)文章

  • Python--Redis實(shí)戰(zhàn)三章Redis命令:第五節(jié):有序集合

    摘要:對給定的有序集合執(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ā)布與訂閱 和散列存儲著鍵與值之間...

    xinhaip 評論0 收藏0
  • Python--Redis實(shí)戰(zhàn)三章Redis命令:第七節(jié):其他命令

    摘要:上一篇文章實(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...

    masturbator 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<