一击碗、訂閱分發(fā)模式介紹
Redis發(fā)布訂閱—Pub/Sub模式或者說是觀察者模式。我想大家即使沒有使用過,也已經(jīng)耳熟能詳了婚瓜。
先簡(jiǎn)單舉例說明下應(yīng)用場(chǎng)景,在場(chǎng)景中我們可以分析到其優(yōu)勢(shì)在哪刑棵。
比如你的線上應(yīng)用應(yīng)用巴刻,你想設(shè)置一個(gè)日志報(bào)警系統(tǒng),當(dāng)應(yīng)用出現(xiàn)異常的時(shí)候蛉签,立馬發(fā)送通知給你胡陪,可能是短信的形式,也可能是郵件的形式碍舍。當(dāng)然如果只將報(bào)警通知給你一個(gè)人柠座,實(shí)現(xiàn)起來很簡(jiǎn)單,在報(bào)警系統(tǒng)中將你的手機(jī)號(hào)和短信寫死在程序中片橡。但是如果你的項(xiàng)目龐大妈经,每個(gè)模塊有各自的負(fù)責(zé)人,并且負(fù)責(zé)人也經(jīng)常會(huì)變更捧书,那么咱們就不能總修改代碼了吧吹泡?
或者說你的個(gè)人博客可以讓讀者訂閱,讀者這么多经瓷,咱們根本控制不過來呀爆哑。
現(xiàn)在發(fā)布訂閱模式,就可以解決你的問題了嚎。在某一點(diǎn)發(fā)生改變的時(shí)候泪漂,其他客戶端立即得到通知。也可以說訂閱服務(wù)器得到應(yīng)用發(fā)布消息歪泳,由服務(wù)器立即通知給你手中的客戶端萝勤。這樣的好處就是一種松耦合的模式,你不再需要修改發(fā)布端和訂閱端的任何代碼呐伞,你只要提供好發(fā)布和訂閱的操作接口敌卓,今后調(diào)用就可以了。
二伶氢、Redis幫助類
1趟径、連接redis數(shù)據(jù)庫(kù)
public static ConnectionMultiplexer Manager
private static ConnectionMultiplexer GetManager(string connectionString=null)
{
if(string.IsNullOrEmpty(connectionString))
{
connectionString = "127.0.0.1";
}
return ConnectionMultiplexer.Connect(connectionString);
}
2瘪吏、發(fā)布函數(shù)
public long RedisPub(string channel, T msg)
{
ISubscriber sub = Manager.GetSubscriber();
return sub.Publish(channel, SerializeContent(msg));
}
3、訂閱函數(shù)
訂閱函數(shù)的回調(diào)函數(shù)的輸入?yún)?shù)為得到的消息
public void RedisSub(string subChannael,Actioncallback)
{
ISubscriber sub = Manager.GetSubscriber();
sub.Subscribe(subChannael, (channel, message) =>
{
Console.WriteLine(channel+":"+message);
callback(message);
});
}
4蜗巧、取消訂閱函數(shù)
public void Unsubscribe(string channel)
{
ISubscriber sub = Manager.GetSubscriber();
sub.Unsubscribe(channel);
}
5掌眠、取消所有訂閱函數(shù)
public void UnsubscribeAll()
{
ISubscriber sub = Manager.GetSubscriber();
sub.UnsubscribeAll();
}
三、訂閱客戶端程序
1幕屹、Main函數(shù)
static void Main(string[] args)
{
RedisHelp.RedisHelp client = new RedisHelp.RedisHelp();
client.RedisSub("myFirstChannel", SubCallBack);
client.RedisSub("mySecondChannel");
Console.ReadLine();
}
2蓝丙、消息回調(diào)函數(shù)
只有當(dāng)收到消息時(shí),回調(diào)函數(shù)被調(diào)用望拖,不用使用另外的線程來循環(huán)訂閱渺尘。訂閱只需要一次即可。
private static void SubCallBack(string msg)
{
Console.WriteLine("Cliect1:{0}",msg);
}
四说敏、發(fā)布客戶端程序
1鸥跟、后臺(tái)代碼
private void button1_Click(object sender, EventArgs e)? ? ? ??
{? ? ? ? ? ? client.RedisPub("myFirstChannel", textBox1.Text);
}
2、UI界面(winform)
五盔沫、測(cè)試結(jié)果
發(fā)布客戶端發(fā)送A医咨,訂閱客戶端接收到A,第一個(gè)接收結(jié)果是RedisHelp庫(kù)中的函數(shù)打印的迅诬,第二個(gè)是庫(kù)函數(shù)調(diào)用回調(diào)函數(shù)打印的腋逆。