一、前言
日常開發中,我們常需要操作redis,本章節介紹ASP.Net Core 使用StackExchange.Redis
Docs:https://stackexchange.github.io/StackExchange.Redis/
二、介紹
StackExchange.Redis 是適用於 .NET 語言(C# 等)的高效能通用 Redis 客戶端。它是BookSleeve的邏輯繼承者,是由Stack Exchange為Stack Overflow等繁忙網站開發(並使用)的客戶端。
特徵
- 高效能多路複用設計,允許高效使用多個呼叫執行緒的共享連線
- 對 Redis 節點配置的抽象:客戶端可以默默地協商多個 Redis 伺服器以實現穩健性和可用性
- 方便地訪問完整的 Redis 功能集
- 同步和非同步使用的完整雙程式設計模型,無需使用 TPL“同步優於非同步”
- 支援redis“叢集”
三、建立專案
四、新增StackExchange.Redis引用
-
開啟管理Nuget程式包
-
搜尋StackExchange.Redis
-
之前選擇的目標框架是ASP.NET Core 5.0,所以安裝StackExchange.Redis v2.6.116
-
安裝完成
五、簡單使用
-
透過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(); } } }
-
透過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
預設資料庫索引,從 0
到databases - 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, else2.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();
}
}
}