Redis學習筆記~分布式的Pub/Sub模式

redis的客戶端有很多,這次用它的pub/sub發布與訂閱我選擇了StackExchange.Redis,發布與訂閱大家應該很清楚了,首先一個訂閱者,訂閱一個服務,服務執行一些處理程序(可能是寫個日志,插入個數據,發個email)然后當另一個項目的某個業務發布這個服務后,被訂閱的程序將會被執行,這個聽起來很有意思,redis有好的實現了這個pub/sub功能。

看一下結構圖

?

Sub訂閱(消息消費者)

對于訂閱方,這里類似于一個服務,它會長期運行著,被啟動后動態訂閱一些服務進來,以便以后再被其它服務調用

        //sub a function in A-projectPubSubManager.Instance.Subscribe("UserLog", (msg) =>{//訂閱者處理自己的業務邏輯,這相關于隊列服務要干的事
                Console.WriteLine(msg);});

Pub發布(消息生產者)

而對于其它項目,如A網站,它可能在被在POST動作后發布這個UserLog的服務,這時上面的訂閱方將會消費它(消費者模式),或者服務代碼被執行!

     [HttpPost]public ActionResult Index(string user){PubSubManager.Instance.Publish("UserLog", user + "這個用戶提交表單了");return View();}

對于一直運行的服務,將會收到來自不同項目的消息,而它只負責消費它!

Lind.DDD.PublishSubscribe

封裝了一些標準的pub/sub方法,它可以有多種實現方法,本例使用redis這個中間件

   /// <summary>/// 發布訂閱的接口規則/// </summary>public interface IPubSub{/// <summary>/// 發布,有順序,對象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void Publish(string channel, string value);/// <summary>/// 訂閱,對象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void Subscribe(string channel, Action<string> action);/// <summary>/// 異步發布,無順序,對象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void PublishAsync(string channel, string value);/// <summary>/// 異步訂閱,無順序,對象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeAsync(string channel, Action<string> action);/// <summary>/// 發布,有順序,對象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void PublishByte(string channel, byte[] value);/// <summary>/// 訂閱,對象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeByte(string channel, Action<byte[]> action);/// <summary>/// 異步發布,有順序,對象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void PublishByteAsync(string channel, byte[] value);/// <summary>/// 異步訂閱,對象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeByteAsync(string channel, Action<byte[]> action);/// <summary>/// 發布,有順序,對象源是泛型對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="value"></param>void Publish<T>(string channel, T value);/// <summary>/// 訂閱,對象源是泛型對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="action"></param>void Subscribe<T>(string channel, Action<T> action);/// <summary>/// 異步發布,有順序,對象源是泛型對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="value"></param>void PublishAsync<T>(string channel, T value);/// <summary>/// 異步訂閱,對象源是泛型對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeAsync<T>(string channel, Action<T> action);/// <summary>/// 取消指定訂閱/// </summary>/// <param name="channel"></param>void UnSubscribe(string channel);/// <summary>/// 取消所有訂閱/// </summary>/// <param name="channel"></param>void UnSubscribeAll();}

?本文轉自博客園張占嶺(倉儲大叔)的博客,原文鏈接:Redis學習筆記~分布式的Pub/Sub模式,如需轉載請自行聯系原博主。

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

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

相關文章

django自定義用戶表

django自帶了用戶表。 -- auto-generated definition create table auth_user (id int auto_incrementprimary key,password varchar(128) not null,last_login datetime(6) null,is_superuser tinyint(1) not null,username varchar(150) not null,fir…

easyui關機圖標_如何在Windows 10中創建關機圖標

easyui關機圖標It’s true that shutting down your Windows 10 PC the old-fashioned way only takes three clicks. But why spend the extra energy when you can do it in two? All you have to do is create a shutdown icon, and you’ll save yourself some time. 的確…

Struts2+JFreeChart

下面以邊帖圖片和代碼的方式來講解Struts2與JFreeChart的整合。搭建環境&#xff1a;首先帖一張工程的目錄結構以及所需的jar包。注意:如果你不打算自己寫ChartResult的話只需要引入struts2-jfreechart-plugin-2.0.6.jar(這個在struts-2.0.6-all.zip可以找到了): …

STM32的FLASH ID加密

#define FLASH_ID_OFFSET 30000 //任意定義一個數 //把地址直接減去或者加上一個數是不要程序中直接出現這個地址 volatile u32 Flash_ID_addr[3]{ 0x1FFFF7E8 - FLASH_ID_OFFSET, 0x1FFFF7EC FLASH_ID_OFFSET, 0x1FFFF7F0 - FLASH_ID_OFFSET }; /**讀取STM32 FLASH ID*…

linux c視頻如何加水印,如何在Kdenlive的視頻上進行水印 | MOS86

如果你這些東西被稱為水印。他們So&#xff0c;你如何在Linux中創建水印&#xff1f;嗯&#xff0c;你這可能是Linux上最強大的開源視頻編輯器。Installation如果您尚未安裝Kdenlive&#xff0c;您應該可以在包裹管理器中找到它。在Ubuntu中&#xff0c;您還可以使用命令:sudo …

mac觸控板手勢無法使用_如何在iPad上使用觸控板手勢

mac觸控板手勢無法使用Apple蘋果Apple’s new floating Magic Keyboard case for the iPad Pro looks fantastic, but you don’t need to spend $299 to use a trackpad. Simply connect a Magic Trackpad or a third-party multi-touch trackpad to get access to all of iPa…

02.并發編程(2)Thread類源碼分析

概述 在說線程之前先說下進程&#xff0c;進程和線程都是一個時間段的描述&#xff0c;是CPU工作時間段的描述。 進程&#xff0c;是并發執行的程序在執行過程中分配和管理資源的基本單位&#xff0c;是一個動態概念&#xff0c;竟爭計算機系統資源的基本單位。每一個進程都有一…

安裝SQLserver2008

雙擊點擊setup&#xff0c;以管理員身份運行&#xff1b; 點擊安裝-》全新SQLServer獨立安裝或向現有安裝添加功能 選擇下一步&#xff0c;然后點擊具有高級服務的express版本&#xff0c;點擊下一步&#xff1b; 點擊選擇我接受許可條款&#xff0c;然后繼續點擊下一步&#x…

如何在沒有Word的情況下打開Microsoft Word文檔

Microsoft Word is part of Microsoft Office and requires an up-front purchase or a Microsoft 365 subscription. If you’re using a computer without Word installed, there are other ways to view that DOCX or DOC file. Microsoft Word是Microsoft Office的一部分&a…

redhat9Linux解壓gz,linux (redhat9)下subversion 的安裝

搞了一個subversion 花費了我兩天的時間&#xff0c;其間雖然有干其他的事情&#xff0c;但是來來回回的裝&#xff0c;搞的我是一點脾氣都沒有了&#xff0c;俗話說不經歷風雨真的見不到彩虹。就是這個意思. 原本本的下來一.準備好安裝包打算使用apache來瀏覽subversion &…

數組去重的4種方法(Which one is the fastest???嘻嘻嘻....)

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>Document</title> </head> <body> <input type"button" value"數組去重1" οnclick"show()"&g…

flask中的模型

1.什么是模型   模型&#xff0c;是根據數據庫中表的結構而創建出來的class。每一張表對應到編程語言中&#xff0c;就是一個class表中的每一個列對應到編程語言中就class中的一個屬性。 2.ORM的三大特征   1.數據表(table)到編程類(class)的映射     數據庫中的每一張…

windows復制文件路徑_如何在Windows 10上復制文件的完整路徑

windows復制文件路徑Sometimes, it’s handy to copy the full path of a file or folder in Windows 10 to the clipboard. That way, you can paste the path into an open or upload dialog quickly without having to browse for it the file. Luckily, there’s an easy w…

用c語言復制字符串的元音字母,急求:編寫程序,將一個字符串中的元音字母復制到另一個字符串,然后輸出。...

#include#includevoid str(char a[100],char b[100]){int i0, j0;while(a[i]!\0)//\0代表ASCLL碼0的字符&#xff0c;即是一個空操作符也就是是結束符;{if(a[i]a||a[i]e||a[i]i||a[i]o||a[i]u){b[j]a[i];j;}i;}}int main(){char a[100];char b[100];gets(a);str(a,b);puts(b);r…

05 替換空格

題目描述&#xff1a; 請實現一個函數&#xff0c;將一個字符串中的每個空格替換成“%20”。例如&#xff0c;當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。 解題思路有&#xff1a; #判斷字符串是否為空&#xff0c;判斷length是否大于0。 #記錄空格的數…

超鏈接禁用_在Microsoft Word 2003和2007中禁用自動超鏈接

超鏈接禁用If you can’t stand the automatic hyperlinking in Microsoft Word, you might be hard-pressed to find the right place to disable it in Office 2007, since all the settings are hidden so well compared to previous versions. 如果您無法在Microsoft Word中…

c語言如何創建虛擬串口,模擬串口的C語言源程序代碼

本程序是模擬串口硬件機制寫的&#xff0c;使用時可設一定時中斷&#xff0c;時間間隔為1/4波特率&#xff0c;每中斷一次調用一次接收函數&#xff0c; 每中斷4次調用一次發送函數,不過.對單片機來說時鐘并須要快.要知道9600的波特率的每個BIT的時間間隔是104us.而單片機中斷一…

webjars管理靜態資源

webjars用途簡單解釋 : 利用Servlet3協議規范中,包含在JAR文件/META-INF/resources/路徑下的資源可以直接被web訪問到這一原理&#xff0c;將前端靜態資源打成jar包方便管理 靜態資源打jar包 新建maven工程&#xff0c; 將需要打包的靜態資源放入src/main/resources中 2. ma…

Windows Intellij環境下Gradle的 “Could not determine Java version from ‘9.0.1’”的解決方式...

當我導入Gradle項目初試Java spring的時候&#xff0c;遇到下面報錯: Gradle complete project refresh failed Error:Could not determine java version from 9.0.1. 參考這篇 http://www.ddiinnxx.com/solving-not-determine-java-version-9-0-1-gradle-intellij-macosx/ 進行…

如何計算iPhone和Apple Watch上的步數

Khamosh PathakKhamosh PathakAccording to conventional wisdom, 10,000 steps a day equals a healthy life. No matter what your target is, though, you’ll need a reliable way to count your steps. The good news is you can do so on your iPhone or Apple Watch! 根…