python實現Redis訂閱發布

Redis 發布訂閱

Redis 發布訂閱可以用在像消息通知,群聊,定向推送,參數刷新加載等業務場景

發布訂閱模型有三個角色:

  1. 發布者(Publisher)
  2. 訂閱者(Subscriber)
  3. 頻道(channel)

每個訂閱者可以訂閱多個頻道,發布者可以在某個頻道里發布消息,訂閱者會接受到自己訂閱頻道里發布的消息。

1.相關命令 (參考)

publish channel message         發布消息
subscribe [channel]             訂閱頻道
unsubscribe [channel]           取消訂閱
psubscribe [pattern...]         訂閱指定模式的頻道
punsubscribe [pattern...]       退訂指定模式的頻道
pubsub channels                 列出至少有一個訂閱者的頻道
pubsub numsub [channel...]      列表給定頻道的訂閱者數量
pubsub numpat                   列表被訂閱模式的數量 

在終端使用示例

# 在 終端1 訂閱cctv1
127.0.0.1:8100> subscribe cctv1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cctv1"
3) (integer) 1
# 在 終端2 向cctv1 發布消息
127.0.0.1:8100> publish cctv1 "this is cctv1"
(integer) 1
# 終端1 接受到終端2發的消息
127.0.0.1:8100> subscribe cctv1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cctv1"
3) (integer) 1
1) "message"
2) "cctv1"
3) "this is cctv1"

2. python 實現

訂閱者類,只寫了訂閱功能,退訂原理是一樣的,偷了懶,把訂閱頻道和接收消息寫到了一個方法里面,如果嚴格按面向對象的思想應該分開。

from PublishAndSubscribe.Channel import Channel
from PublishAndSubscribe.RedisTool import RedisToolclass Subscriber:def __init__(self, conn):self._conn = conndef subscribe(self, channel: Channel):# 獲取發布/訂閱對象pub = self._conn.pubsub()# 選擇要訂閱的頻道pub.subscribe(channel.name)while True:# 接收消息msg = pub.parse_response()print(msg)if __name__ == '__main__':client = RedisTool.redis_connection("0.0.0.0", 8100, "password")cctv1 = Channel("CCTV1")Subscriber(client).subscribe(cctv1)

發布者類

from PublishAndSubscribe.Channel import Channel
from PublishAndSubscribe.RedisTool import RedisToolclass Publisher:def __init__(self, conn):self._conn = conndef publish(self, channel: Channel, mess: str):# 向特定頻道發布消息self._conn.publish(channel.name, mess)if __name__ == '__main__':cctv1 = Channel("CCTV1")client = RedisTool.redis_connection("0.0.0.0", 8100, "password")publisher = Publisher(client)while True:publisher.publish(cctv1, input("請輸入要發送的消息:"))

頻道類,Redis中頻道的概念只是一個字符串

class Channel:def __init__(self, name: str):self.name = name

一個工具類,用來連接redis

import redisclass RedisTool:@staticmethoddef redis_connection(address: str, port: int, password: str):"""用來連接RedisArgs:address: Redis 服務端IP地址port: [int] Redis 服務端口password: Redis client 登錄憑證Return:type[Redis]: 返回一個redis對象"""return redis.StrictRedis(address, port, password=password)
  • 為了簡便在訂閱者和發布者兩處都實例化了一個“CCTV1”的頻道,雖然用起來不會有什么問題(Redis中簡單的通過字符串區分頻道),但在實際中這應該是同一個對象。

結果:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457501.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nfs的快速部署

1、nfs內核自帶協議模塊不用安裝,如果沒有yum安裝yum -y install nfs-utils2、配置vim /etc/exports #配置文件 此文件一般為空,編寫格式為: /share/word 192.168.31.254(rw) 192.168.31.252(ro) # 共享/share/word目錄給192.168.…

redistemplate怎么修改數據_如何使用RedisTemplate訪問Redis數據結構?

在springboot項目中,集成各種框架變得非常容易。下面簡單介紹一下如何在springboot項目中集成單機模式redis。集群模式也差不多,這里就不過多介紹了。首先你得安裝redis服務,無論在linux還是windows系統上。如果沒有安裝,請自行百…

HyperLogLog原理與在Redis中的使用

Redis-HyperLogLog 基于HyperLogLog算法,使用極小的空間完成巨量運算 Redis 中HyperLogLog 基本使用 常用命令 PFADD key element [element …]: 將任意數量的元素添加到指定的 HyperLogLog 里面。PFCOUNT key [key …]: 計算hyperloglog的獨立總數prmerge destk…

iOS開發UI篇—xib的簡單使用

一、簡單介紹 xib和storyboard的比較,一個輕量級一個重量級。 共同點: 都用來描述軟件界面 都用Interface Builder工具來編輯 不同點: Xib是輕量級的,用來描述局部的UI界面 Storyboard是重量級的,用來描述整個軟件的多個界面&…

【云棲計算之旅】線下沙龍第2期精彩預告:Docker在云平臺上的最佳實踐

Docker是一個開源的應用容器引擎,提供了一種在安全、可重復的環境中自動部署軟件的方式,允許開發者將他們的應用和依賴包打包到一個可移植的容器中,然后發布到任何流行的Linux機器上,也可以實現虛擬化。容器完全使用沙箱機制&…

小程序mpvue圖片繪制水印_開發筆記:使用 mpvue 開發斗圖小程序

之前用過 wepy 框架寫了個小程序 GitHub - yshkk/shanbay-mina: 基于 wepy 框架的 “扇貝閱讀” 微信小程序 ,感覺寫法上類似 vue,但不那么徹底。現在美團點評發布的 mpvue 支持開發者可以用 vue 的語法開發微信小程序,正好有強需求需要一個斗…

mysql int類型的長度值

整數類型的存儲和范圍(來自mysql手冊) 類型字節最小值最大值(帶符號的/無符號的)(帶符號的/無符號的)TINYINT1-1281270255SMALLINT2-3276832767065535MEDIUMINT3-83886088388607016777215INT4-2147483648214748364704294967295BIGINT8-92233720368547758089223372036854775807…

龍王我當定了(一個在QQ刷龍王的腳本)

自從學了python,龍王再也沒丟過,就是經常被打, QQ 和 TIM 都可以,發送時要把聊天窗口打開。 # 如果import報錯,那可以pip下載這幾個模塊試一試 import win32gui import win32con import win32clipboard as w import random from…

時序數據合并場景加速分析和實現 - 復合索引,窗口分組查詢加速,變態遞歸加速...

時序數據合并場景加速分析和實現 - 復合索引,窗口分組查詢加速,變態遞歸加速 作者 digoal 日期 2016-11-28 標簽 PostgreSQL , 數據合并 , 時序數據 , 復合索引 , 窗口查詢 背景 在很多場景中,都會有數據合并的需求。 例如記錄了表的變更明細…

navicat for mysql 數據庫備份與還原

一, 首先設置, 備份保存路徑 工具 -> 選項 點開 其他 -> 日志文件保存路徑 二. 開始備份 備份分兩種, 一種是以sql保存, 一種是保存為備份 SQL保存 右鍵點擊你要備份的數據庫, -> 轉儲SQL文件 選擇位置和文件名 開始轉儲 導入 建議 刪除所有表 或 重新建數據庫 同導出…

DES的原理及python實現

DES加密算法原理及實現 DES是一種對稱加密算法【即發送者與接收者持有相同的密鑰】,它的基本原理是將要加密的數據劃分為n個64位的塊,然后使用一個56位的密鑰逐個加密每一個64位的塊,得到n個64位的密文塊,最后將密文塊拼接起來得…

python按身高體重排隊_LeetCode-python 406.根據身高重建隊列

題目鏈接難度:中等 類型: 數組假設有打亂順序的一群人站成一個隊列。 每個人由一個整數對(h, k)表示,其中h是這個人的身高,k是排在這個人前面且身高大于或等于h的人數。 編寫一個算法來重建這個隊列。注意:總人數…

遠程連接mysql數據庫,1130問題

遠程或使用非127.0.0.1和localhost地址連接時,出現代號為1130問題, ERROR 1130: Host 192.168.2.159 is not allowed to connect to this MySQL server 猜想這是沒有授權,將mysql數據庫中user表中host列的localhost改為%,重新啟動…

華為手機充滿有提醒嗎_2020手機充電速度排名:最快21分鐘充滿,華為第15名

5G手機扎堆出現,中國5G基站數量也是不斷增多,中國移動曾經表態,2020年底將會在全國地級市覆蓋5G網絡,全民5G時代終于到來!從目前國內手機出貨量數據來看,5G手機占比已經達到了六成以上,國產5G手…

關于移動手機端富文本編輯器qeditor圖片上傳改造

日前項目需要在移動端增加富文本編輯,上網找了下,大多數都是針對pc版的,不太兼容手機,當然由于手機屏幕小等原因也限制富文本編輯器的眾多強大功能,所以要找的編輯器功能必須是精簡的。 找了好久,發現qedit…

【python】生成器

生成器 直接總結 創建生成器的方法 生成器表達式:(i for i in [1, 2])yield: 函數中出現yield這個函數就是生成器,函數(生成器)執行到yield時會返回yield后面的值,并暫停,知道下次被喚醒后會從暫停處接著…

python redis 性能測試臺_Redis性能測試

Redis 性能測試Redis 性能測試是通過同時執行多個命令實現的。Redis性能測試主要是通過src文件夾下的redis-benchmark來實現(Linux系統下)語法redis 性能測試的基本命令如下:redis-benchmark [option] [option value]實例以下實例同時執行 10000 個請求來檢測性能&a…

Java IO 系統

Java IO系統 File類 用來處理文件目錄,既可以代表一個特定文件的名稱,也可以代表一組文件的名稱,如果代表的是一個文件組,可以調用File.list()方法返回一個字符數組。 list()不傳遞任何參數時返回該目錄下所有文件或文件名的字…

Linux Crontab 任務管理工具命令以及示例

Crontab 是 Linux 平臺下的一款用于循環執行例行任務的工具,Linux 系統由 cron (crond) 這個系統服務來控制任務 , Linux系統本來就有很多的計劃任務需要啟動 , 所以這個系統服務是默認開機啟動的 。 Linux 為使用者提供的計劃任務的命令就是 Crontab Crontab 是 Linux 下用來周…

Linux 網絡編程詳解一(IP套接字結構體、網絡字節序,地址轉換函數)

IPv4套接字地址結構 struct sockaddr_in {uint8_t sinlen;(4個字節)sa_family_t sin_family;(4個字節)in_port_t sin_port;(2個字節)struct in_addr sin_addr;(4個字節)char sin_zer…