C#ASP.Net Core 5.0 使用StackExchange.Redis

Destiny、Yang發表於2024-03-26

一、前言

日常開發中,我們常需要操作redis,本章節介紹ASP.Net Core 使用StackExchange.Redis

Docs:https://stackexchange.github.io/StackExchange.Redis/

二、介紹

StackExchange.Redis 是適用於 .NET 語言(C# 等)的高效能通用 Redis 客戶端。它是BookSleeve的邏輯繼承者,是由Stack ExchangeStack Overflow等繁忙網站開發(並使用)的客戶端。

特徵

  • 高效能多路複用設計,允許高效使用多個呼叫執行緒的共享連線
  • 對 Redis 節點配置的抽象:客戶端可以默默地協商多個 Redis 伺服器以實現穩健性和可用性
  • 方便地訪問完整的 Redis 功能集
  • 同步和非同步使用的完整雙程式設計模型,無需使用 TPL“同步優於非同步
  • 支援redis“叢集”

三、建立專案

四、新增StackExchange.Redis引用

  1. 開啟管理Nuget程式包

  2. 搜尋StackExchange.Redis

  3. 之前選擇的目標框架是ASP.NET Core 5.0,所以安裝StackExchange.Redis v2.6.116

  4. 安裝完成

五、簡單使用

  1. 透過ConfigurationOptions連線redis服務

    using System;
    
    namespace StackExchange.Redis.ASPNetCore
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConfigurationOptions redisOptions = new ConfigurationOptions();
                string host = "";//伺服器地址
                int port = 6379;//埠號
                string serviceName = "";//用於透過sentinel解析服務的服務名稱。
                string password = "";//密碼
                string user = "";//使用者名稱
                string key = "";//所需獲取的key
                redisOptions.EndPoints.Add(host, port);
                redisOptions.AbortOnConnectFail = false; //獲取或設定是否應透過TimeoutException顯式通知連線/配置超時。
                redisOptions.ServiceName = serviceName;
                redisOptions.Password = password;
                redisOptions.User = user;
                ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(redisOptions);
                IDatabase db = connection.GetDatabase(0);
                var result = db.StringGet(key);
                Console.WriteLine(result);
                Console.ReadKey();
            }
        }
    }
    
  2. 透過configuration連線redis

    配置可參考:https://stackexchange.github.io/StackExchange.Redis/Configuration

    using System;
    
    namespace StackExchange.Redis.ASPNetCore
    {
        class Program
        {
            static void Main(string[] args)
            {
                string key = "";//所需獲取的key
                string configuration = "host:port,abortConnect=false,servicename={string},password={string},user={string}";
                ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(configuration);
                IDatabase db = connection.GetDatabase(0);
                var result = db.StringGet(key);
                Console.WriteLine(result);
                Console.ReadKey();
            }
        }
    }
    
    

    Configuration Options

    ConfigurationOptions物件具有廣泛的屬性,所有這些屬性都在智慧感知中得到了完整記錄。一些更常見的選項包括:

    Configuration string(配置字串) ConfigurationOptions(配置項) Default(預設值) Meaning(意義)
    abortConnect={bool} AbortOnConnectFail true (false on Azure) 如果為 true,Connect則在沒有可用伺服器時不會建立連線
    allowAdmin={bool} AllowAdmin false 啟用一系列被認為有風險的命令
    channelPrefix={string} ChannelPrefix null 所有釋出/訂閱操作的可選通道字首
    checkCertificateRevocation={bool} CheckCertificateRevocation true 一個布林值,指定在身份驗證過程中是否檢查證書吊銷列表。
    connectRetry={int} ConnectRetry 3 初始期間重複連線嘗試的次數Connect
    connectTimeout={int} ConnectTimeout 5000 連線操作超時(毫秒)
    configChannel={string} ConfigurationChannel __Booksleeve_MasterChanged 用於傳達配置更改的廣播通道名稱
    configCheckSeconds={int} ConfigCheckSeconds 60 檢查配置的時間(秒)。如果支援的話,這可以作為互動式套接字的保持活動狀態。
    defaultDatabase={int} DefaultDatabase null 預設資料庫索引,從0databases - 1
    keepAlive={int} KeepAlive -1 傳送訊息以幫助保持套接字處於活動狀態的時間(秒)(預設為 60 秒)
    name={string} ClientName null redis 內連線的標識
    password={string} Password null redis伺服器的密碼
    user={string} User null Redis 伺服器的使用者(與 Redis 6 及更高版本上的 ACL 一起使用)
    proxy={proxy type} Proxy Proxy.None 使用的代理型別(如果有);例如“twemproxy/envoyproxy”
    resolveDns={bool} ResolveDns false 指定 DNS 解析應該是顯式且急切的,而不是隱式的
    serviceName={string} ServiceName null 用於連線到哨兵主要服務
    ssl={bool} Ssl false 指定應使用 SSL 加密
    sslHost={string} SslHost null 在伺服器證書上強制執行特定的 SSL 主機身份
    sslProtocols={enum} SslProtocols null 使用加密連線時支援的 Ssl/Tls 版本。使用“|” 提供多個值。
    syncTimeout={int} SyncTimeout 5000 允許同步操作的時間(毫秒)
    asyncTimeout={int} AsyncTimeout SyncTimeout 允許非同步操作的時間(毫秒)
    tiebreaker={string} TieBreaker __Booksleeve_TieBreak 用於在不明確的主要場景中選擇伺服器的關鍵
    version={string} DefaultVersion (4.0 in Azure, else 2.0) Redis 版本級別(當伺服器不提供此功能時有用)
    tunnel={string} Tunnel null 連線隧道(用於http:{proxy url}基於“連線”的代理伺服器)
    setlib={bool} SetClientLibrary true 是否嘗試使用CLIENT SETINFO設定連線上的庫名稱/版本
    protocol={string} Protocol null 使用的Redis協議;請參閱下面的部分

六、哨兵模式使用

​ 在日常工作中,redis基本不會僅有一個伺服器在工作,這會使系統有巨大的風險,一旦redis服務當機了,依賴redis的服務就會跟隨當機,所以我們基本會採用一個redis叢集(一臺Master + sentinel角色,兩臺Slave + sentinel角色)。透過哨兵模式提高redis叢集的可用性和穩定性。

using System;
using System.Collections.Generic;

namespace StackExchange.Redis.ASPNetCore
{
    class Program
    {
        static void Main(string[] args)
        {
            string key = "";//所需獲取的key
            ConfigurationOptions sentinelOptions = new ConfigurationOptions();
            List<string> sentinelAdressList = new List<string>();
            sentinelAdressList.Add("");//伺服器地址
            sentinelAdressList.Add("");//伺服器地址
            sentinelAdressList.Add("");//伺服器地址
            int sentinelPort = 6379;//埠號
            string serviceName = "";//用於透過sentinel解析服務的服務名稱。
            string password = "";//密碼
            string user = "";//使用者名稱
            foreach (var sentinel in sentinelAdressList)
            {
                sentinelOptions.EndPoints.Add(sentinel, sentinelPort);
            }
            sentinelOptions.CommandMap = CommandMap.Sentinel;//命令對映設定成哨兵
            sentinelOptions.AbortOnConnectFail = false;//獲取或設定是否應透過TimeoutException顯式通知連線/配置超時。
            sentinelOptions.ServiceName = serviceName;
            sentinelOptions.Password = password;

            ConfigurationOptions redisOptions = new ConfigurationOptions();
            redisOptions.AbortOnConnectFail = false;//獲取或設定是否應透過TimeoutException顯式通知連線/配置超時。
            redisOptions.ServiceName = serviceName;
            redisOptions.Password = password;       
            redisOptions.User = user;
            //建立連線到Sentinel伺服器的ConnectionMultiplexer例項
            ConnectionMultiplexer _sentinelConnect = ConnectionMultiplexer.SentinelConnect(sentinelOptions);
            var masterConnection = _sentinelConnect.GetSentinelMasterConnection(redisOptions);
            IDatabase db = masterConnection.GetDatabase(0);
            var result = db.StringGet(key);
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }
}

相關文章