前言

    本来昨天应该更新的,但是由于各种原因,抱歉,让追这个系列的朋友久等了。上一篇文章 

1.2 开始使用 SqlServer 分布式缓存

.Net Core 中的分布式缓存统一接口是 IDistributedCache 该接口定义了一些对缓存常用的操作,比如我们常见的 Set/Get 方法,而 SqlServer 分布式缓存由 SqlServerCache 类实现,该类位于命名空间 Microsoft.Extensions.Caching.SqlServer 中

        public void ConfigureServices(IServiceCollection services)         {             services.AddDistributedSqlServerCache(options =>             {                 options.SystemClock = new BLL.LocalSystemClock();                 options.ConnectionString = this.Configuration["ConnectionString"];                 options.SchemaName = "dbo";                 options.TableName = "AspNetCoreCache";                 options.DefaultSlidingExpiration = TimeSpan.FromMinutes(1);                 options.ExpiredItemsDeletionInterval = TimeSpan.FromMinutes(5);             });             ...         }

上面的方法 ConfigureServices(IServiceCollection services) 中使用 services.AddDistributedSqlServerCache() 这个扩展方法引入了 SqlServer 分布式缓存,并作了一些简单的配置,该配置是由 SqlServerCacheOptions 决定的,SqlServerCacheOptions 的配置非常重要,这里强烈建议大家手动配置

1.3 了解 SqlServerCacheOptions,先来看一下SqlServerCacheOptions 的结构
namespace Microsoft.Extensions.Caching.SqlServer {     public class SqlServerCacheOptions : IOptions<SqlServerCacheOptions>     {         public SqlServerCacheOptions();         // 缓存过期扫描时钟         public ISystemClock SystemClock { get; set; }         // 缓存过期逐出时间,默认为 30 分钟         public TimeSpan? ExpiredItemsDeletionInterval { get; set; }         // 缓存数据库连接字符串         public string ConnectionString { get; set; }         // 缓存表所属架构         public string SchemaName { get; set; }         // 缓存表名称         public string TableName { get; set; }         // 缓存默认过期时间,默认为 20 分钟         public TimeSpan DefaultSlidingExpiration { get; set; }     } }

该配置非常简单,仅是对缓存使用的基本配置
首先,使用 options.SystemClock 配置了一个本地时钟,接着设置缓存过期时间为 1 分钟,缓存过期后逐出时间为 5 分钟,其它则是连接数据库的各项配置
在缓存过期扫描的时候,使用的时间正是 options.SystemClock 该时钟的时间,默认情况下,该时钟使用 UTC 时间,在我的电脑上,UTC 时间是得到的是美国时间,所以这里实现了一个本地时钟,代码非常简单,只是获取一个本地时间

    public class LocalSystemClock : Microsoft.Extensions.Internal.ISystemClock     {         public DateTimeOffset UtcNow => DateTime.Now;     }
1.4 在控制器中使用分布式缓存
    [Route("api/Home")]     [ApiController]