长沙电信网站备案,卖游戏币网站制作,随州市网站建设,现在装修流行什么样的风格前言本来昨天应该更新的#xff0c;但是由于各种原因#xff0c;抱歉#xff0c;让追这个系列的朋友久等了。上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存#xff0c;那么本篇文章就来了解一下如何使用分布式缓存#xff0c;通过本章#xff0… 前言 本来昨天应该更新的但是由于各种原因抱歉让追这个系列的朋友久等了。上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存那么本篇文章就来了解一下如何使用分布式缓存通过本章你将了解到如何使用分布式缓存以及最重要的是如何选择适合自己的分布式缓存本章主要包含两个部分内容提要使用 SqlServer 分布式缓存使用 Redis 分布式缓存实现自定义的分布式缓存客户端注册扩展关于本示例的使用说明1. 使用 SqlServer 分布式缓存1.1 准备工作请依照以下步骤实施1 创建一个 Asp.Net Core MVC 测试项目Ron.DistributedCacheDemo2 为了使用 SqlServer 作为分布式缓存的数据库需要在项目中引用 Microsoft.EntityFrameworkCore 相关组件3 在 SqlServer 数据库引擎中创建一个数据库命名为TestDb4 打开 Ron.DistributedCacheDemo 项目根目录执行创建缓存数据表的操作执行命令后如果输出信息Table and index were created successfully. 表示缓存表创建成功dotnet sql-cache create Server.\SQLEXPRESS;Usersa;Password123456;DatabaseTestDb dbo AspNetCoreCache1.2 开始使用 SqlServer 分布式缓存.Net Core 中的分布式缓存统一接口是 IDistributedCache 该接口定义了一些对缓存常用的操作比如我们常见的 Set/Get 方法而 SqlServer 分布式缓存由 SqlServerCache 类实现该类位于命名空间 Microsoft.Extensions.Caching.SqlServer 中在 Startup.cs 中注册分布式缓存上面的方法 ConfigureServices(IServiceCollection services) 中使用 services.AddDistributedSqlServerCache() 这个扩展方法引入了 SqlServer 分布式缓存并作了一些简单的配置该配置是由 SqlServerCacheOptions 决定的SqlServerCacheOptions 的配置非常重要这里强烈建议大家手动配置1.3 了解 SqlServerCacheOptions先来看一下SqlServerCacheOptions 的结构该配置非常简单仅是对缓存使用的基本配置首先使用 options.SystemClock 配置了一个本地时钟接着设置缓存过期时间为 1 分钟缓存过期后逐出时间为 5 分钟其它则是连接数据库的各项配置在缓存过期扫描的时候使用的时间正是 options.SystemClock 该时钟的时间默认情况下该时钟使用 UTC 时间在我的电脑上UTC 时间是得到的是美国时间所以这里实现了一个本地时钟代码非常简单只是获取一个本地时间1.4 在控制器中使用分布式缓存首先使用依赖注入在 HomeController 中获得 IDistributedCache 的实例对象该实例对象的实现类型为 SqlServerCache然后通过 Index 方法增加一项缓存 CurrentTime 并设置其值为当前时间然后再另一接口 GetValue 中取出该 CurrentTime 的值运行程序打开地址http://localhost:5000/api/home/settime然后查看缓存数据库缓存项 CurrentTime 已存入数据库中访问接口http://localhost:5000/api/home/gettime 得到缓存项 CurrentTime 的值等到超时时间过期后再到数据库查看发现缓存项 CurrentTime 还在数据库中这是因为缓存清理机制造成的1.5 缓存清理在缓存过期后每次调用 Get/GetAsync 方法都会 调用 SqlServerCache 的 私有方法 ScanForExpiredItemsIfRequired() 进行一次扫描然后清除所有过期的缓存条目扫描方法执行过程也很简单就是直接执行数据库查询语句DELETE FROM {0} WHERE UtcNow ExpiresAtTime值得注意的是在异步方法中使用同步调用不会触发缓存逐出因为其线程退出导致 Task.Run 未能运行比如下面的代码将导致 SqlServerCache 无法完整执行方法 ScanForExpiredItemsIfRequired()因为其内部使用了 Task 进行异步处理正确的做法是使用 await this.cache.GetStringAsync(CurrentTime);1.6 关于缓存清理方法 ScanForExpiredItemsIfRequired在多线程环境下该方法可能除非多次重复扫描即可能会多次执行 SQL 语句 DELETE FROM {0} WHERE UtcNow ExpiresAtTime 但是这也仅仅是警告而已并没有任何可改变其行为的控制途径1.7 IDistributedCache 的其它扩展方法.Net Core 中还对 IDistributedCache 进行了扩展甚至允许通过 Set 方法传入一个 DistributedCacheEntryOptions 以覆盖全局设置这些扩展方法的使用都比较简单直接传入相应的值即可在此不再一一介绍希望深入研究的同学可以手动逐一测试1.8 关于 AddDistributedSqlServerCache() 方法AddDistributedSqlServerCache 方法内部实际上是进行了一系列的注册操作其中最重要的是注册了 SqlServerCache 到 IDistributedCache 接口该操作使得我们可以在控制器中采用依赖注入的方式使用 IDistributedCache 的实例查看 AddDistributedSqlServerCache 方法的代码片段2. 使用 Redis 分布式缓存要在 Asp.Net Core 项目中使用 Redis 分布式缓存需要引用包Microsoft.Extensions.Caching.Redis.Net Core 中的 Redis 分布式缓存客户端由 RedisCache 类提供实现 RedisCache 位于程序集 Microsoft.Extensions.Caching.StackExchangeRedis.dll 中该程序集正是是依赖于大名鼎鼎的 Redis 客户端 StackExchange.Redis.dllStackExchange.Redis 有许多的问题其中最为严重的是超时问题不过这不知本文的讨论范围如果你希望使用第三方 Redis 客户端替代 StackExchange.Redis 来使用分布式缓存你需要自己实现 IDistributedCache 接口好消息是IDistributedCache 接口并不复杂定义非常简单2.1 在 Startup.cs 中注册 Redis 分布式缓存配置注册 Redis 分布式缓存配置和使用 StackExchange.Redis 的方式完全相同需要注意的是 RedisCacheOptions 包含 3 个属性而 Configuration 和 ConfigurationOptions 的作用是相同的一旦设置了 ConfigurationOptions 就不应该再去设置属性 Configuration 的值因为在 AddDistributedRedisCache() 注册内部会判断如果设置了 ConfigurationOptions 的值则不再使用 Configuration但是我们建议还是通过属性 Configuration 去初始化 Redis 客户端因为这是一个连接字符串而各种配置都可以通过连接字符串进行设置这和使用 StackExchange.Redis 的方式是完全一致的2.2 使用缓存细心的你可能已经发现了上面的这段代码和之前演示的 SqlServerCache 完全一致是的仅仅是修改一下注册的方法我们就能在项目中进行无缝的切换但是对于缓存有强依赖的业务建议还是需要做好缓存迁移确保项目能够平滑过渡唯一不同的是使用 Redis 分布式缓存允许你在异步方法中调用同步获取缓存的方法这不会导致缓存清理的问题因为缓存的管理已经完全交给了 Redis 客户端 StackExchange.Redis 了3. 实现自定义的分布式缓存客户端下面的代码表示实现一个 CSRedis 客户端的分布式缓存注册扩展3.1 定义 CSRedisCache 实现 IDistributedCache 接口代码不多都是实现 IDistributedCache 接口然后在 IDisposable.Dispose 中释放资源3.2 自定义一个配置类 CSRedisClientOptions该配置类主要是为 CSRedis 客户端接收配置使用3.3 注册扩展方法 CSRedisCacheServiceCollectionExtensions自定义一个扩展方法进行配置初始化工作简化实际注册使用时的处理步骤3.4 在 Startup.cs 中使用扩展上面的代码就简单实现了一个第三方分布式缓存客户端的注册和使用3.5 测试自定义分布式缓存客户端,创建一个测试控制器 CustomerController该控制器简单实现两个接口NewId/GetId运行程序输出结果正常调用 NewId 接口创建一条缓存记录调用 GetId 接口获取缓存记录至此我们完整的实现了一个自定义分布式缓存客户端注册4. 关于本示例的使用说明4.1 首先看一下解决方案结构该解决方案红框处定义了 3 个不同的 Startup.cs 文件分别是CSRedisStartup 自定义缓存测试启动文件Sql_Startup SqlServer 测试启动文件StackChangeRedis_StartupStackChange.Redis 测试启动文件在使用本示例的时候通过在 Program.cs 中切换不同的启动文件进行测试 public static IWebHostBuilder CreateWebHostBuilder(string[] args) WebHost.CreateDefaultBuilder(args).UseStartupRon.DistributedCacheDemo.Startups.SqlServer.Startup();结束语通过介绍我们了解到如何在 Asp.Net Core 中使用分布式缓存了解了使用不同的缓存类型如 SqlServer 和 Redis了解到了如何使用不同的缓存类型客户端进行注册了解到如何实现自定义缓存客户端还知道了在调用 SqlServer 缓存的时候异步方法中的同步调用会导致 SqlServerCache 无法进行过期扫描CSRedisCore 此项目是由我的好朋友 nicye 维护GitHub 仓库地址访问CSRedisCore示例代码下载https://files.cnblogs.com/files/viter/Ron.DistributedCacheDemo.zip原文地址https://www.cnblogs.com/viter/p/10161581.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com