本系列博文已經全部完成,完整系列請訪問:https://blog.zhuliang.ltd/tags/StackExchange-Redis%E7%B3%BB%E5%88%97/
本文轉自:https://blog.zhuliang.ltd/2020/01/backend/StackExchangeRedis-BasicUsage.html
- 本系列博文是“偽”官方檔案翻譯,并非完全將官方檔案進行翻譯,而是我在查閱、測驗原始檔案并轉換為自己東西后進行的“準”翻譯,
- 原始檔案見此:https://stackexchange.github.io/StackExchange.Redis/
- 本系列本博文基于 redis 5.0.6,系列中部分博文跟官方檔案有出入,有不同見解 / 說明不當的地方,還請大家不吝拍磚,
ConnectionMultiplexer 說明
命名空間位于:StackExchange.Redis.ConnectionMultiplexer
- ConnectionMultiplexer 是 StackExchange.Redis 的核心物件,內部繼承了 IDisposable,但建議不要用 using 以便可以愉快重用,你就認為它足夠安全吧,
- 該物件執行緒安全,且應該被重用,搞成單例即可,不要每次操作都創建一個,
主從庫示例:
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("server1:6379,server2:6379");
專案中呼叫實體
說明:示例基于 .NET CORE 2.1,通過 IoC 進行注入,生命周期為“單例”,
如果不通過 IoC 的話建議直接使用“單例模式”,
public class RedisClient : ICache
{
private readonly RedisSettings _redisSettings;
private static IDatabaseAsync _db;
public RedisClient(IOptions<RedisSettings> redisSettings)
{
_redisSettings = redisSettings.Value;
var redis = ConnectionMultiplexer.Connect($"{_redisSettings.Address}:{_redisSettings.Port}");
_db = redis.GetDatabase(_redisSettings.DataBase);
}
#region Implementation of ICache
public async Task<bool> SetStringAsync(string key, string content)
{
return true;
}
public async Task<string> GetStringAsync(string key)
{
var result = await _db.StringGetAsync(key);
return result;
}
#endregion
}
其他一些建議和說明
- StackExchange.Redis 有 3種主要使用機制:
- 同步
- 異步:建議優先使用異步方法而不是同步方法,
- 即發即忘(Fire-And-Forget):當你不需要回應結果的時候,可以使用這種機制,被呼叫方法會立馬回傳,但操作會在后臺進行執行,,
- “即發即忘”機制補充:StackExchange.Redis 的方法中都有 CommandFlags 列舉,默認值是 “None”,當你需要使用“即發即忘”機制的時候,需要在方法上顯示指定 CommandFlags.FireAndForget,需要注意:
- 如果回傳值是一個字串型別,則將總是回傳 null,
- 如果回傳值是一個 Int64 型別,則將總是回傳 0,
- 需要注意的是,如果回傳值是一個 boolean,則回傳的是 false(但操作是成功的,此時不要用該回傳值作為你后續業務的判斷依據),
db.StringIncrement(cacheKey, flags: CommandFlags.FireAndForget);
- StackExchange.Redis.IDatabase 的一些方法,是根據 Redis 的資料型別來進行命名的,如 IDatabase.StringGet,這里的 StringGet 表示的是獲取一個 String ,跟 C# 中的字串并非表示同一個東西,可參考:關于 Redis 的資料型別,
發布/訂閱
- 發布/訂閱不需要指定 database
例子:
客戶端
private readonly RedisSettings _redisSettings;
private static IDatabaseAsync _db;
private static ConnectionMultiplexer _redis;
public RedisClient(IOptions<RedisSettings> redisSettings)
{
_redisSettings = redisSettings.Value;
_redis = ConnectionMultiplexer.Connect($"{_redisSettings.Address}:{_redisSettings.Port}");
_db = _redis.GetDatabase(_redisSettings.DataBase);
}
public async Task Subscribe(string channel, Action<RedisChannel, RedisValue> fun)
{
var sub = _redis.GetSubscriber();
await sub.SubscribeAsync(channel, fun);
}
public async Task Publish(string channel, string message)
{
var sub = _redis.GetSubscriber();
await sub.PublishAsync(channel, message);
}
訂閱者
class Program
{
static void Main(string[] args)
{
var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
var configuration = builder.Build();
var subscriber = configuration["Subscriber"];
var settings = configuration.GetSection("RedisSettings").Get<RedisSettings>();
var redisClient = new RedisClient(settings);
redisClient.Subscribe(settings.ChannelName, (channel, message) =>
{
System.Console.WriteLine($"{subscriber}:{message}");
}).Wait();
System.Console.WriteLine("started");
System.Console.ReadKey();
}
}
測驗效果:
服務器命令
若要使用服務器命令,需要通過 ConnectionMultiplexer 物件獲取 Server 物件,如下:
var server = _redis.GetServer($"{_redisSettings.Address}:{_redisSettings.Port},allowAdmin=true");
server.ScriptExists("scripts here");
目前支持的方法如下
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/73240.html
標籤:.NET Core
上一篇:C#型別轉換原理(編譯器編譯時如何對資料進行型別轉換)
下一篇:socket通信資料出錯
