本来昨天应该更新的,但是由于各种原因,抱歉,让追这个系列的朋友久等了。上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存,那么本篇文章就来了解一下如何使用分布式缓存,通过本章,你将了解到如何使用分布式缓存,以及最重要的是,如何选择适合自己的分布式缓存;本章主要包含两个部分:
内容提要
使用 SqlServer 分布式缓存
使用 Redis 分布式缓存
实现自定义的分布式缓存客户端注册扩展
关于本示例的使用说明
1. 使用 SqlServer 分布式缓存 1.1 准备工作,请依照以下步骤实施1 创建一个 Asp.Net Core MVC 测试项目:Ron.DistributedCacheDemo
2 为了使用 SqlServer 作为分布式缓存的数据库,需要在项目中引用 Microsoft.EntityFrameworkCore 相关组件
3 在 SqlServer 数据库引擎中创建一个数据库,命名为:TestDb
4 打开 Ron.DistributedCacheDemo 项目根目录,执行创建缓存数据表的操作,执行命令后如果输出信息:Table and index were created successfully. 表示缓存表创建成功
dotnet sql-cache create "Server=.\SQLEXPRESS;User=sa;Password=123456;Database=TestDb" dbo AspNetCoreCache 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 时间是得到的是美国时间,所以这里实现了一个本地时钟,代码非常简单,只是获取一个本地时间
首先使用依赖注入,在 HomeController 中获得 IDistributedCache 的实例对象,该实例对象的实现类型为 SqlServerCache,然后通过 Index 方法增加一项缓存 CurrentTime 并设置其值为当前时间,然后再另一接口 GetValue 中取出该 CurrentTime 的值
[Route("api/Home")] [ApiController] public class HomeController : Controller { private IDistributedCache cache; public HomeController(IDistributedCache cache) { this.cache = cache; } [HttpGet("Index")] public async Task<ActionResult<string>> SetTime() { var CurrentTime = DateTime.Now.ToString(); await this.cache.SetStringAsync("CurrentTime", CurrentTime); return CurrentTime; } [HttpGet("GetTime")] public async Task<ActionResult<string>> GetTime() { var CurrentTime = await this.cache.GetStringAsync("CurrentTime"); return CurrentTime; } }运行程序,打开地址::5000/api/home/settime,然后查看缓存数据库,缓存项 CurrentTime 已存入数据库中
访问接口::5000/api/home/gettime 得到缓存项 CurrentTime 的值
等到超时时间过期后,再到数据库查看,发现缓存项 CurrentTime 还在数据库中,这是因为缓存清理机制造成的
1.5 缓存清理