StackExchange.Redis 系列 1:基礎使用

本系列博文已經所有完成,完整系列請訪問:blog.zhuliang.ltd/tags/StackE…html

本文轉自:blog.zhuliang.ltd/2020/01/red…git

  • 本系列博文是「僞」官方文檔翻譯,並不是徹底將官方文檔進行翻譯,而是我在查閱、測試原始文檔並轉換爲本身東西后進行的「準」翻譯。
  • 原始文檔見此:stackexchange.github.io/StackExchan…
  • 本系列本博文基於 redis 5.0.6,系列中部分博文跟官方文檔有出入,有不一樣看法 / 說明不當的地方,還請你們不吝拍磚。

ConnectionMultiplexer 說明

命名空間位於:StackExchange.Redis.ConnectionMultiplexergithub

  • ConnectionMultiplexer 是 StackExchange.Redis 的核心對象,內部繼承了 IDisposable,但建議不要用 using 以即可以愉快重用,你就認爲它足夠安全吧。
  • 該對象線程安全,且應該被重用,搞成單例便可,不要每次操做都建立一個。

主從庫示例:

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("server1:6379,server2:6379");
複製代碼

項目中調用實例

說明:示例基於 .NET CORE 2.1,經過 IoC 進行注入,生命週期爲「單例」。 若是不經過 IoC 的話建議直接使用「單例模式」。redis

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

例子: 客戶端json

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();
    }
}
複製代碼

測試效果:服務器

image

服務器命令

若要使用服務器命令,須要經過 ConnectionMultiplexer 對象獲取 Server 對象,以下:app

var server = _redis.GetServer($"{_redisSettings.Address}:{_redisSettings.Port},allowAdmin=true");
server.ScriptExists("scripts here");
複製代碼

目前支持的方法以下異步

image
相關文章
相關標籤/搜索