Asp.Net Core 轻松学-正确使用分布式缓存
前言
本来昨天应该更新的,但是由于各种原因,抱歉,让追这个系列的朋友久等了。上一篇文章
1.2 开始使用 SqlServer 分布式缓存
.Net Core 中的分布式缓存统一接口是 IDistributedCache 该接口定义了一些对缓存常用的操作,比如我们常见的 Set/Get 方法,而 SqlServer 分布式缓存由 SqlServerCache 类实现,该类位于命名空间 Microsoft.Extensions.Caching.SqlServer 中
- 在 Startup.cs 中注册分布式缓存
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 在控制器中使用分布式缓存
- 首先使用依赖注入,在 HomeController 中获得 IDistributedCache 的实例对象,该实例对象的实现类型为 SqlServerCache,然后通过 Index 方法增加一项缓存 CurrentTime 并设置其值为当前时间,然后再另一接口 GetValue 中取出该 CurrentTime 的值
[Route("api/Home")] [ApiController]