• StackExchange.Redis 系列 1:基础使用


    本系列博文已经全部完成,完整系列请访问:https://blog.zhuliang.ltd/tags/StackExchange-Redis%E7%B3%BB%E5%88%97/

    本文转自:https://blog.zhuliang.ltd/2020/01/redis/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();
        }
    }
    

    测试效果:

    image

    服务器命令

    若要使用服务器命令,需要通过 ConnectionMultiplexer 对象获取 Server 对象,如下:

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

    目前支持的方法如下

    image

  • 相关阅读:
    机器视觉
    视觉感知
    计算机视觉
    模板匹配
    Kinect
    手势识别
    三维重建
    单元化理解
    [面试经] Java
    [面试经]Java中final、finally、finalize有什么不同?
  • 原文地址:https://www.cnblogs.com/deepthought/p/12170192.html
Copyright © 2020-2023  润新知