只有累積,沒有奇蹟

2019年2月19日 星期二

[Redis] C# 存取 Redis - 使用 StackExchange.Redis

前言 
前面幾篇在介紹 Redis 的安裝以及使用 Redis Desktop Manager 工具,現在終於回到主題如何用 C# 存取 Redis 服務,在官方網站推薦的 .NET Redis client(s) 有很多種,討論度最高的為 StackExchange.Redis 其開發者在 StackExchange 公司工作且 Library 廣為 .NET 開發者推薦,這篇文章要介紹 StackExchange.Redis 的安裝及基本用法,若是有不清楚或是錯誤的地方歡迎討論予糾正 

安裝 StackExchange.Redis 
Step 1 : 開 Nuget packer Manager 輸入 StackExchange.Redis,目前提供版本為 2.0.519 版,點擊下載
Step 2 : 安裝時會提示下載套件相依的 dll 內容,選擇下一步即可
或者直接在 Nuget console 直接輸入下列指令進行安裝
PM> Install-Package StackExchange.Redis 
確認下載成功 : 在 dll 中看到有即下載成功

StackExchange.Redis 基本用法 
建立連線
在存取前,首先第一步需要的就是與 Redis 建立連線的動作,在建立連線前想先提到 ConnectionMultiplexer 類別,ConnectionMultiplexer 是整個 StackExchange.Redis 核心類別,Multiplex 設計概念可以參考 Jed 大文章有更詳細說明,主要重點是 connection 分享與重用 (shared and reused),因此不需要重複建立 ConnectionMultiplexer 實體物件。
建立連線可以使用 ConnectionMultiplexer.Connect 或是透過 ConfigurationOptions 類別自行定義,以下面例子來說透過兩種建立連線方法皆可
// connectionString
var conn = ConnectionMultiplexer.Connect("127.0.0.1:6379");

// ConfigurationOptions
ConfigurationOptions config = ConfigurationOptions.Parse("127.0.0.1:6379,allowAdmin=true");
var conn2 = ConnectionMultiplexer.Connect(config.ToString()); 
另外,在連線管理上需要注意的是建立連線後重複使用問題,當每發送一個新的 Request 都建立連線,當 Request 量大時頻繁的 Create / Dipose 會影響其效能,解法是透過 Singleton Pattern 包成一個 Helper 類別處理,在 C# 4.0 之後可以透過 Lazy 語法達到此目的,範例如下
public class RedisConnectorHelper  
{                  
    static RedisConnectorHelper()  
    {  
        RedisConnectorHelper._connection = new Lazy<ConnectionMultiplexer>(() =>  
        {  
            return ConnectionMultiplexer.Connect("localhost");  
        });  
    }  
      
    private static Lazy<ConnectionMultiplexer> _connection ;          
  
    public static ConnectionMultiplexer Connection  
    {  
        get  
        {  
            return _connection.Value;  
        }  
    }  
}   

存取 Redis
完成建立連線之後,使用 Redis database 相當簡單,只需透過一行指令即可完成
var db = conn.GetDatabase();
如果在有多台 Redis Server 或是需要使用非同步 API 需求時,我們可以透過 GetDataBase 參數指定 ServerID (databaseNumber)、設定是否為非同步模式(asyncState),databaseNumber 預設為 -1 與 asyncState 預設為 null ;另外在 GetDataBase 方法回傳 IDataBase  interface,在 IDataBase 介面中定義了存取 Redis Server 常用的存取支援的 DataType 方法簽章,舉例來說常見的 String、List、Hash...等,在前面幾篇使用 Redis-cli  command line 設定 String 可以改為以下 Code
// Set
string value = "Hello World";
db.StringSet("Test", value);
// set timeout 5min
db.StringSet("Test", value, TimeSpan.FromSeconds(300));

// Get 
var test = db.StringGet("Test");
簡單完成 GET / SET String,其中還可以指定特定 Key 的過期時間,使用上相當容易上手;

確認資料
存取完要來確認資料是否有正常寫入可以透過 Redis Desktop Manager 管理工具來確認 Redis 資料狀態
正常寫入,打完收工!!!

心得
這篇介紹了如何在 Visual Studio 安裝 StackExchange.Redis 以及基本的應用 StringGet / StringSet 寫法,個人覺得都算是基本的入門之一,就像是一段 Code 會跑跟怎樣寫得好是不一樣的兩件事,在實作上還是有很多細節與眉角需要關注的地方,之後如果有遇到會在分享出來

參考
Redis系列 - C#存取Redis (上)
StackExchange.Redis

0 意見:

張貼留言

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com