• .Net Core使用分布式缓存Redis:基础


    一、前言

      Redis的介绍网上很多不再赘述。本次环境为net core 2.2,使用的StackExchange.Redis来操作Redis。以前的StackExchange.Redis存在连接超时的情况,现在使用最新版本并全部使用异步方法可以解决。

    二、引用Microsoft.Extensions.Caching.StackExchangeRedis

      通过nuget搜索Microsoft.Extensions.Caching.StackExchangeRedis安装,因为依赖项版本的问题我这里用的版本是2.2.5,其本质上也是封装的StackExchange.Redis,但是它实现了net core规定的IDistributedCache接口。

    三、添加redis服务

      在Startup.cs中的ConfigureServices中添加Redis的服务,会自动进行依赖注入。最简单的如下:

            public void ConfigureServices(IServiceCollection services)
            {//......
                //添加redis连接
                services.AddStackExchangeRedisCache(options =>
                {
                    options.Configuration = "127.0.0.1:6379";
                    options.InstanceName = "SampleInstance";
                });
                //......
            }    

      InstaceName:实例名,加在redis的key前面的。

      Configuration:连接redis的链接。

      还存在一个优先级更高的ConfigurationOptions,可以配置多个redis服务的连接、密码等。

            public void ConfigureServices(IServiceCollection services)
            {//.....
                //添加redis连接
                services.AddStackExchangeRedisCache(options =>
                {
                    options.ConfigurationOptions = new ConfigurationOptions()
                    {
                        EndPoints = { { "127.0.0.1", 6379 } },
                        //Password = "123456"
                    };
                });
                //......
            }

      具体的属性如下:

    配置选项默认含义
    AbortOnConnectFail truefalse在Azure上) 如果为true,Connect则在没有服务器可用时将不会创建连接
    AllowAdmin false 启用一系列被认为具有风险的命令
    ChannelPrefix null 所有发布/订阅操作的可选通道前缀
    ConnectRetry 3 初始期间重复尝试连接的次数 Connect
    ConnectTimeout 5000 连接操作超时(毫秒)
    ConfigurationChannel __Booksleeve_MasterChanged 用于传达配置更改的广播频道名称
    ConfigCheckSeconds 60 检查配置的时间(秒)。如果支持,它可以充当交互式套接字的保持活动状态。
    DefaultDatabase null 默认数据库索引,从0databases - 1
    KeepAlive -1 发送消息以帮助套接字保持活动的时间(秒)(默认为60秒)
    ClientName null 标识Redis中的连接
    Password null Redis服务器密码
    Proxy Proxy.None 使用中的代理类型(如果有);例如“ twemproxy”
    ResolveDns false 指定DNS解析应该是明确且渴望的,而不是隐式的
    ResponseTimeout SyncTimeout 决定套接字是否不健康的时间(毫秒)
    Ssl false 指定应使用SSL加密
    SslHost null 在服务器的证书上强制使用特定的SSL主机身份
    SslProtocols null 使用加密连接时支持Ssl / Tls版本。使用“ |” 提供多个值。
    SyncTimeout 5000 允许同步操作的时间(毫秒)
    TieBreaker __Booksleeve_TieBreak 在模棱两可的主方案中用于选择服务器的密钥
    DefaultVersion 3.0在Azure中,否则2.0 Redis版本级别(在服务器不可用时有用)
    WriteBuffer 4096 输出缓冲区的大小

    四、操作Redis

      在控制器中通过构造函数依赖注入获取redis连接对象。

    public class HomeController : Controller
    {
      private readonly IDistributedCache cache;
      public HomeController(IDistributedCache _cache)
      {
        this.cache = _cache;
      }
    }

      由于是实现了IDistributedCache规定的接口Get、Set、Remove、Refresh等。

      所以设置缓存(有则更新,无则新增)、获取缓存、刷新缓存(不是刷新值是刷新过期时间)和删除缓存的代码如下。

    //编辑缓存
    cache.SetString(key, value);
    //获取缓存
    var values = cache.GetString(key);
    //更新缓存过期时间
    cache.RefreshAsync(key);
    //删除缓存
    cache.RemoveAsync(key);

      如果想设置缓存过期时间则通过DistributedCacheEntryOptions,它可以设置滑动过期时间(SlidingExpiration)、绝对过期时间(AbsoluteExpiration)和相对于现在的绝对过期时间(AbsoluteExpirationRelativeToNow)。

    var options = new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(20));
    cache.SetString(key, value, options);

      通过redis的可视化工具Redis Desktop Manager可以看到缓存存储在一号库为hash类型,有我们存储的值、滑动过期时间和绝对过期时间。不过获取到的数据为string。

     五、使用StackExchange.Redis

      上面的代码存在一个问题,就是IDistributedCache之后对缓存的存储默认为其规定格式的hash类型,虽然我们获取到的数据为string。这样我们想操作list、set等其他类型就不行了,并且不能指定库进行存储。所以为了更加灵活这时候就要直接用StackExchange.Redis。

      因为引用Microsoft.Extensions.Caching.StackExchangeRedis的时候已经带上了StackExchange.Redis.dll的依赖项,所以不用再引用了,否则在nuget中搜索StackExchange.Redis进行引用。

      1.基本使用

      StackExchange.Redis 中核心对象是在 StackExchange.Redis 命名空间中的 ConnectionMultiplexer 类,这个对象隐藏了多个服务器的详细信息。 因为 ConnectionMultiplexer 要做很多事,所以它被设计为在调用者之间可以共享和重用,不需要在执行每一个操作的时候就创建一个 ConnectionMultiplexer ,它完全是线程安全的。 但现在,让我们来先创建一个ConnectionMultiplexer 类的实例保存以重用。 使用 ConnectionMultiplexer.Connect 或 ConnectionMultiplexer.ConnectAsync方法,传递配置字符串或ConfigurationOptions 对象(同上面提到过的)。 配置字符串可以采用逗号分隔的一系列节点的形式访问多个服务,所以让我们在默认端口(6379)上连接到本地机器上的一个实例:

    private static ConnectionMultiplexer redisConnection { get; }
    static RedisCache()
    {
      redisConnection = ConnectionMultiplexer.Connect("127.0.0.1:6379");
    }

      ConnectionMultiplexer实现了IDisposable接口而且可以在不再需要的时候处理释放掉。

      2.使用Redis

      访问Redis使用上述获取的连接对象:

    IDatabase db = redisConnection.GetDatabase(0);

      用GetDatabase()返回的对象成本很低,不需要特殊存储。可以传入redis数据库的号码,使用指定数据库,上面的例子就是使用0号数据库。

      拥有了IDatabase就可以调用方法去操作redis,所有的方法都有同步和异步两套,命名和微软要求的一样。

      下面简单的对五种数据类型进行基础操作:

      (1)String字符串

      添加

    await redisConnection.GetDatabase().StringSetAsync(key, value, TimeSpan.FromSeconds(20));

      获取

    await redisConnection.GetDatabase().StringGetAsync(key);

      (2)List列表

      从列表底部和顶部插入

    //底部插入
    await redisConnection.GetDatabase().ListRightPushAsync(key, value);
    //顶部插入
    await redisConnection.GetDatabase().ListLeftPushAsync(key, value);

      从列表底部和顶部获取一个数据

    //底部获取一个
    await redisConnection.GetDatabase().ListRightPopAsync(key);
    //顶部获取一个
    await redisConnection.GetDatabase().ListLeftPopAsync(key);

      (3)Hash哈希

      添加

    await redisConnection.GetDatabase().HashSetAsync(key, primaryKey, value1);
    await redisConnection.GetDatabase().HashSetAsync(key, primaryKey, value2);

      获取

    await redisConnection.GetDatabase().HashGetAsync(key, primaryKey);

      (4)Set集合

      添加

    await redisConnection.GetDatabase().SetAddAsync(key, value);

      获取并集

    await redisConnection.GetDatabase().SetCombine(SetOperation.Union, key1, key2);

      (5)Sorted Set有序集合

      添加

    await redisConnection.GetDatabase().SortedSetAdd(key, value, sort);

      

  • 相关阅读:
    CentOS 5.5和5.6 安装后的网络配置
    CentOS 5.5 系统安全配置
    printk: messages suppressed
    “找不到出路的”vb6.0
    用户控件的烦扰
    rman恢复
    oracle数据字典
    oracle自关联表的子删父变功能实现
    oracle自治事务
    oracle表空间更名
  • 原文地址:https://www.cnblogs.com/xwc1996/p/11973611.html
Copyright © 2020-2023  润新知