C# Redis


C# Redis

  1. 發布訂閱模型
  2. Redis中的發布訂閱
  3. 客戶端編程示例
  4. 0.3版本Hredis

發布訂閱模型

在應用級其作用是為了減少依賴關系,通常也叫觀察者模式。主要是把耦合點單獨抽離出來作為第三方,隔離易變化的發送方和接收方。

發送方:只負責向第三方發送消息。(雜志社把讀者雜志交給郵局)
接收方:被動接收消息。(1:向郵局訂閱讀者雜志,2:門口去接郵過來的雜志)
第三方作用是:存儲訂閱雜志的接收方,並在雜志過來時送給接收方。 (郵局)

C#示例,發送方把雜志放到郵局里面:

    if (QA.AddBug())
            EmailNotify();
接收方到郵局登記地址,有雜志過來時送貨上門:
    EmailNotify += () => { Console.WriteLine("A君"); };
    EmailNotify += () => { Console.WriteLine("B君"); };

第三方郵局接受讀者雜志訂閱,收到雜志時進行派送:

    public delegate void MessageHandler();
    public static event MessageHandler  EmailNotify;

        if (QA.AddBug())
            EmailNotify();

當我們把觀察者模式放大到系統級時,就是發布訂閱(pub/sub)了。 主要是用來降低發布者和訂閱者的耦合,提高前端系統吞吐量。結構如圖:

Redis中的發布訂閱

Redis實現完整的發布訂閱范式,就是說任何一台redis服務器,啟動后都可以當做發布訂閱服務器。

普通訂閱

啟動訂閱者client。

redis-cli.exe -h 127.0.0.1 -p 6379

訂閱bar頻道。格式:SUBSCRIBE name1 name2。 
成功訂閱回復,分別對應訂閱類型、訂閱頻道、訂閱數量。

127.0.0.1:6379> SUBSCRIBE bar
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "bar"
3) (integer) 1

新起個發布者client,發送消息。格式:publish channelName Message。

127.0.0.1:6379> publish bar val
(integer) 1

訂閱client回復,分別對應消息類型,頻道,消息。

1) "message"
2) "bar"
3) "val"

圖例

模式訂閱

Redis支持模式匹配訂閱,*為模糊匹配符。
訂閱所有頻道的消息

PSUBSCRIBE *  

訂閱以news.開頭的所有頻道。

PSUBSCRIBE news.*

取消訂閱

取消普通訂閱和取消模式訂閱的命令。

UNSUBSCRIBE  bar
PUNSUBSCRIBE  ba*

取消在官方提供的連接工具中無法模擬的。

查看訂閱信息

查看訂閱消息是redis在2.8中心增加的命令之一。

pubsub channels [pattern] 。

返回當前服務器被訂閱的所有頻道。

127.0.0.1:6379> pubsub channels
1) "bar"

指定匹配參數,返回與模式匹配的所有頻道。

127.0.0.1:6379> pubsub channels ba*
1) "bar"

pubsub numsub [channel-1 channel-2 ...channel-n]

接受任意多個頻道作為輸入參數,返回這些頻道的訂閱者數量。

127.0.0.1:6379> pubsub numsub  bar bar2
1) "bar"
2) (integer) 1
3) "bar2"
4) (integer) 0

客戶端編程示例

復制代碼
            RedisPubSub client = new RedisPubSub("127.0.0.1", 6381);
            client.OnUnSubscribe += (obj) => {
                Console.WriteLine();
            };
            client.OnMessage = (sender, arcgs) =>{
                Console.WriteLine(arcgs);
            };
            client.OnError = (Exception) => { 
                Console.WriteLine(Exception.Message);
            };
            client.Subscribe("bar");

            Console.ReadLine();
復制代碼

0.3版本HRedis

基本使用

    using (RedisClient client = new RedisClient("127.0.0.1", 6381))
        {
            client.Set("key", "value");
            client.Get("key");
        }

使用連接池,自動回收連接。

        PoolRedisClient prc = new PoolRedisClient(new PoolConfiguration());

        prc.Single.Set("key", "value");

        prc.Single.Get("key");

及上面的訂閱。

 

C# Redis系列(二)-Hredis客戶端設計及開源

2015-04-18 08:02 by 蘑菇先生, 1155 閱讀, 收藏編輯
接上篇c#實現redis客戶端(一),重新整理些了下。閱讀目錄:項目說明Hredis設計圖單元測試場景總結項目說明背景:因為有地方要用,而又沒找到對sentinel良好支持的Net客戶端,所以就簡單重寫了個。目標:盡可能的簡單,輕量級,不進行過度的封裝,使用方便。代碼說明: 1. 與Redis...

AutoMapper使用手冊(一)

2015-02-14 18:00 by 蘑菇先生, 948 閱讀, 收藏編輯
閱讀目錄 1. 介紹 2. 基本使用 3. 自動分割映射(Flattening) 4.自定義字段映射(Projection) 5.驗證配置(Configuration validation)介紹AutoMapper是一個輕量級的類庫,主要功能是把一個對象轉換成另外一個對象,而避免我們每次都...

Net作業調度(五)—quartz.net動態添加job設計

2015-01-19 08:42 by 蘑菇先生, 1623 閱讀, 收藏編輯
介紹在實際項目使用中quartz.net中,都希望有一個管理界面可以動態添加job,而避免每次都要上線發布。也看到有園子的同學問過。這里就介紹下實現動態添加job的幾種方式, 也是二次開發的核心模塊。目錄一:傳統方式二:框架反射方式三:進程方式四:URL方式五:框架配置方式六:總結一:傳統方式1: ...

Net作業調度(四)—quartz.net持久化和集群

2015-01-18 15:17 by 蘑菇先生, 1240 閱讀, 收藏編輯
介紹在實際使用quartz.net中。持久化能保證實例重啟后job不丟失、 集群能均衡服務器壓力和解決單點問題。quartz.net在這二塊配置都比較方便,來看下。一:持久化quartz.net的持久化,是把job、trigger一些信息存儲到數據庫里面,以解決內存存儲重啟丟失。1: 下載sql腳本...

c#實現redis客戶端(一)

2015-01-12 08:55 by 蘑菇先生, 1678 閱讀, 收藏編輯
最近項目使用中要改造redis客戶端。就看了下文檔,總結分享一下。目錄一:協議規范二:基礎通信三:狀態命令四:set、get命令五:管道、事務六:總結一:協議規范redis允許客戶端以TCP方式連接,默認6379端口。傳輸數據都以\r\n結尾。請求格式*\r\n$\r\n\r\n例:*1\r\n$...

日志系統實戰(三)-分布式跟蹤的Net實現

2014-12-13 20:16 by 蘑菇先生, 1728 閱讀, 收藏編輯
介紹 在大型系統開發調試中,跨系統之間聯調開始變得不好使了。莫名其妙一個錯誤爆出來了,日志雖然有記錄,但到底是哪里出問題了呢? 是ios端參數傳的不對?還是A系統或B系統提供的接口導致?相信大家碰到不少,大多數問題不大,但排查起來比較費勁。 下面,我們來看下具體實現。目錄一:概述二:web環...

日志系統實戰(二)-AOP動態獲取運行時數據

2014-11-27 08:22 by 蘑菇先生, 1624 閱讀, 收藏編輯
介紹這篇距上一篇已經拖3個月之久了,批評自己下。通過前面一篇介紹。我們通過mono反射代碼,可以拿出編譯好的靜態數據、例如方法參數信息之類的。但實際情況是:我更需要運行時的數據,就是用戶輸入等外界的動態數據。既然是動態的,那就是未知的。我們怎么通過提前注入的代碼獲取呢? 其實這是一個思路的問題,下面...

Net作業調度(三) — Quartz.Net進階

2014-11-17 22:32 by 蘑菇先生, 488 閱讀, 收藏編輯
介紹前面我們介紹Quartz.Net的基本用法,但在實際應用中,往往有更多的特性需求。 比如記錄job執行的執行歷史,發郵件等。目錄1:Quartz.Net插件2:TriggerListener,JobListener3:Cron表達式4:Quartz.Net 線程池5:總結Quartz.Net插件...

Net作業調度(二) -CrystalQuartz遠程管理

2014-11-01 18:21 by 蘑菇先生, 712 閱讀, 收藏編輯
Source Code-1.6M介紹接着上一篇。 我們已經初步會使用Quartz.NET了。但如果想方便的知道某個作業執行情況,並暫停,啟動等等,這時候就需要個管理界面了。本文介紹Quartz.NET 遠程管理。如圖:實戰一:作業服務端 static void Main(string[] args)...

Net作業調度(一) -Quartz.Net入門

2014-11-01 13:14 by 蘑菇先生, 850 閱讀, 收藏編輯
背景很多時候,項目需要在不同個時刻,執行一個或很多個不同的作業。Windows執行計划這時並不能很好的滿足需求了。 這時候需要一個更為強大,方便管理,集部署的作業調度了。介紹Quartz一個開源的作業調度框架,OpenSymphony的開源項目。Quartz.Net是Quartz的C#移植版本。它一...

日志系統實戰(一)—AOP靜態注入

2014-08-24 13:00 by 蘑菇先生, 659 閱讀, 收藏編輯
背景近期在寫日志系統,需要在運行時在函數內注入日志記錄,並附帶函數信息。這時候就想到用Aop的方式了。技術分析AOP分動態注入和靜態注入。動態注入方式1:利用Remoting的ContextBoundObject或MarshalByRefObject。2:動態代理(反射),大多AOP框架都用這種方式...

列存儲設計技巧

2014-06-02 11:37 by 蘑菇先生, 191 閱讀, 收藏編輯
背景: 開發個學生系統,數據庫設計。設計實施:傳統數據庫學生表行設計學號姓名性別年齡1張三男162李紅女153王五男16當想擴展屬性時,相對應的會增加字段。學號姓名性別年齡住址1張三男16河南2李紅女15湖北3王五 男16北京實際開發中這樣做的缺點:1:屬性字段向主表加,會導致列越來越多,增加表...

開源地址 https://github.com/mushroomsir/HRedis

作者:蘑菇先生 出處:  http://mushroom.cnblogs.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM