在ASP.NET Core应用程序中使用分布式缓存

2018 年 12 月 25 日

在ASP.NET Core应用程序中使用分布式缓存

本文要点


  • ASP.NET Core内置了分布式缓存接口。

  • 分布式缓存的主要好处有性能、数据共享和稳定性。

  • Couchbase服务器是一个内存优先的数据库,非常适合作为分布式缓存。

  • NuGet程序包使得在应用程序中添加Couchbase服务器变得非常容易。

  • 使用“IDistrubutedCache”接口屏蔽掉细节,使得在ASP.NET Core控制器中与缓存的交互变得简单。


随着.NET Core 2.0 的发布,微软拥有了这个通用、模块化、跨平台开源平台的下一个主要版本,该平台最初发布于 2016 年。在创建过程中,.NET Core包含了.NET Framework 当前版本提供的许多 API。它最初是为了下一代ASP.NET解决方案而创建的,但现在,它推动了包括物联网、云和下一代移动解决方案在内的许多其他场景的发展,并成为它们的基础。在这个介绍.NET Core的第二系列中,我们将进一步探讨.NET Core的一些好处,以及它如何使传统的.NET 开发人员以及所有需要为市场提供健壮而又经济的高性能解决方案的技术人员受益。


缓存可以帮助提高ASP.NET Core应用程序的性能。对于部署到服务器群或可伸缩云环境的ASP.NET Core应用程序,分布式缓存非常有用。微软的文档中包含了使用 SQL Server 或 Redis 做缓存的示例,但在本文中,我将展示另一种方法。Couchbase 服务器是一个分布式数据库,具有内存优先(或可选择仅限内存)的存储体系结构,这使它成为缓存的理想选择。与 Redis 不同,它具有一套更丰富的功能,你可以在以后的用例和产品扩展时使用它们。但在这篇文章中,我将重点介绍它的缓存功能和与ASP.NET Core的集成。Github 上提供了所有的代码示例


分布式缓存的优点


  1. 性能:缓存会将数据存储在RAM中,可以进行方便快捷地检索。从这个缓存中检索数据通常比每次都使用原始数据源要快。

  2. 缓存数据共享:如果你的ASP.NET Core应用程序正在使用多服务器部署,那么负载均衡器可以把用户定向到任何一个ASP.NET Core服务器。如果缓存的数据在Web服务器上,那么你就需要打开粘性会话,以确保用户总是被定向到相同的ASP.NET Core服务器。这可能导致负载不均匀和其他网络问题——更多细节请参见Stack Overflow上的回答)。

  3. 稳定性:如果一个ASP.NET Core Web服务器宕机或者因为什么原因需要重启,这不会影响缓存的数据。重启后,它仍然在分布式缓存中。


无论你使用哪种工具作为分布式缓存(Couchbase、Redis 或 SQL Server), ASP.NET Core为你希望使用的任何缓存技术都提供了一致的接口。


安装 Couchbase


第一步是让分布式缓存服务器运行起来。选择对你而言最方便的安装方法。你可以使用 Docker 或云提供商,也可以在本地机器上安装它(我在本文中就是这样做的)。它是免费下载的,你可以使用免费的 Couchbase 社区版。(企业版对于预生产使用也是免费的,并且没有限制,但在本文中,我将使用社区版)


在安装 Couchbase 时,你需要打开 Web 浏览器并跟随一个简短的向导完成设置。对于这篇文章,使用默认设置即可。



安装 Couchbase 后,创建一个“桶(bucket)”。这是存储缓存数据的地方。我将我的桶命名为为“infoqcache”。我创建了一个“临时(Ephemeral)”桶(这是一个仅限内存的选项)。你还可以使用“Couchbase”桶(首先将数据存储在内存中,并异步地持久化到磁盘上)。



Couchbase 设置的最后一个步骤是安全。向那个桶添加一个具有适当权限的 Couchbase 用户。我给我的用户取名为“infoq”,并给它设置了一个密码“password”(在生产环境中,请使用更强的密码!)。在企业版中,有许多角色可供选择,但是对于这个简单的用例,我们不需要它们。对于 infoqcache,“桶完全访问(Bucket Full Access)”已经足够了。



在开始使用ASP.NET Core之前,请确保你已经完成了所有这些安装步骤。下面是链接到更详细文档的步骤。


  1. 安装Couchbase(按照下载页面上的指令)

  2. 设置Couchbase(探索服务器配置

  3. 创建一个桶

  4. 创建一个用户,并授予访问桶的权限(在UI界面上创建和管理用户


新建一个ASP.NET Core应用程序


我将创建一个ASP.NET Core API 示例应用程序,展示ASP.NET Core的分布式缓存功能。这将是一个有两个端点的小而简单的应用程序。


我用的是 Visual Studio 2017。从中,我选择文件→新建→Web→ASP.NET Core Web 应用程序。



下一步是选择使用哪种ASP.NET Core项目模板。我使用了基本的“API”,没有身份验证和 Docker 支持。



这个项目有一个 ValuesController.cs 文件。我将用我自己的代码替换这个类中的大部分代码。这是我要创建的第一个端点。它不使用任何缓存,并且有一个Thread.Sleep,用于模拟高延迟数据访问(设想一下,用缓慢的 Web 服务调用或复杂的数据库查询替换Thread.Sleep)。


[Route("api/get")]public string Get(){    // 生成一个新字符串    var myString = Guid.NewGuid() + " " + DateTime.Now;
// 等待5秒 (模拟一个缓慢的操作) Thread.Sleep(5000);
// 返回这个值 return myString;}
复制代码


启动该网站(在 Visual Studio 中按 Ctrl+F5)。你可以使用Postman之类的工具与这个端点交互。但是,对于这个例子来说,浏览器已经足够了。在我的示例项目中,站点将启动到localhost:64921,我将该端点的路由配置成api/get。因此,在浏览器中,我输入localhost:64921/api/get



这是一个简单的例子,但是它展示了这个端点 a)获取了某个唯一的字符串值,b)花了很长时间。每次刷新至少要等待 5 秒钟。这将是引入缓存来改善延迟和性能的好地方。


ASP.NET Core和 Couchbase 集成


我们现在已经有了一个需要缓存的ASP.NET Core应用程序,以及一个希望提供帮助的 Couchbase 服务器实例。让它们一起工作吧。


第一步是从 NuGet 安装程序包。你可以使用 NuGet UI 搜索 Couchbase.Extensions.Caching,或者你可以在包管理器控制台中运行此命令:Install-Package Couchbase.Extensions.Caching -Version 1.0.1。这是一个开源项目,Github 上提供了完整的源代码


NuGet 将安装ASP.NET Core应用程序与 Couchbase 服务器通信以及与ASP.NET Core内置的分布式缓存功能集成所需的所有包。


现在,打开项目中的Startup.cs文件。这里,你需要向 ConfigureServices 方法添加一些设置代码。


services.AddCouchbase(opt =>{    opt.Servers = new List<Uri>    {        new Uri("http://localhost:8091")    };    opt.Username = "infoq";    opt.Password = "password";});
services.AddDistributedCouchbaseCache("infoqcache", opt => { });
复制代码


(在文件顶部,我还添加了using Couchbase.Extensions.Caching; 和using Couchbase.Extensions.DependencyInjection;,但是,我是使用 ReSharper 自动识别和添加的)。


在上述代码中,AddCouchbaseAddDistributedCouchbaseCache是添加到ASP.NET Core内置接口IServiceCollection中扩展方法。


AddCouchbase方法告诉ASP.NET Core如何连接到 Couchbase,并提供我前面提到的用户名和密码。


AddDistributedCouchbaseCache方法告诉ASP.NET Core如何把 Couchbase 作为一个分布式缓存使用,并指定了我前面提到的桶的名称。


GitHub 上提供了这个扩展的文档不要忘记在 ConfigureServices 方法中添加清理/拆除代码。


使用ASP.NET Core的分布式缓存


现在,我们已经配置了ASP.NET Core,它已经知道如何缓存了。让我们把它应用在一个简单的例子中。


对于分布式缓存,我们可以做的最简单的事情是将其注入到ValuesController中,并直接使用IDistributedCachedirectly


首先,向构造函数添加一个参数IDistributedCacheas


public ValuesController(IDistributedCachecache){    _cache = cache;}
复制代码


由于我们已经在 Startup.cs 中配置了分布式缓存,ASP.NET Core知道如何设置这个参数(使用依赖注入)。现在,可以在 ValuesController 中使用_cache来获取/设置缓存中的值。我写了另一个端点 GetUsingCache。它与前面的 Get 端点类似,只是它将使用缓存。在第一次调用之后,它将存储该值,随后的调用将不会再到达 Thread.Sleep。


[Route("api/getfast")]public string GetUsingCache(){    // 这个字符串是否已经在缓存中?    var myString = _cache.GetString("CachedString1");    if (myString == null)    {        // 字符串不在缓存中
// 生成一个新字符串 myString = Guid.NewGuid() + " " + DateTime.Now;
// 等待5秒(模拟一个缓慢的操作) Thread.Sleep(5000);
// 把字符串放入缓存 _cache.SetString("CachedString1", myString);
// 只缓存5分钟 /* _cache.SetString("CachedString1", myString, new DistributedCacheEntryOptions { SlidingExpiration = TimeSpan.FromMinutes(5)}); */ }
return myString;}
复制代码


第一个到/api/getfast 的请求仍然会很慢,但是刷新页面,下一个请求将从缓存中提取数据。切换回 Couchbase 控制台,单击菜单中的“Buckets”,你将看到“infoqcache”桶中现在有一条记录。



有一件重要的事情需要指出,在 ValuesController 中,它与 Couchbase 库没有直接耦合。它完全依赖于ASP.NET Core库。这个通用接口使你能够在任何使用微软标准ASP.NET Core库的地方使用 Couchbase 分布式缓存。而且,全都封装在IDistributedCache接口中,这使你更容易编写测试。


在上面的例子中,缓存的数据将无限期地驻留在缓存中。但是,你也可以为缓存指定一个过期时间。在下面的示例中,端点将缓存数据 5 分钟(在 SlidingExpiration 上指定)。


_cache.SetString("CachedString1", myString, new DistributedCacheEntryOptions { SlidingExpiration = TimeSpan.FromMinutes(5)});
复制代码


小结


ASP.NET Core可以与 Couchbase 服务器集成获得分布式缓存功能。ASP.NET Core提供的标准分布式缓存接口使你可以轻松地开始使用缓存。接下来,就可以通过缓存提升ASP.NET Core分布式应用程序的速度了。


如果你对 Couchbase.Extensions 有任何问题或意见,请务必检出GitHub存储库或在Couchbase . NET SDK论坛上告诉我们。


关于作者


Matthew D. Groves 热衷于编码。不管是 C#、jQuery 还是 PHP,他都会提交 pull 请求。早在上世纪 90 年代,他就为他父母的披萨店编写了一款名为 QuickBASIC 的销售终端应用程序,从那时起,他就一直专业从事编程。目前,他是 Couchbase 的开发大使。他还是 AOP in .NET 一书的作者(由 Manning 出版),也是微软 MVP。


随着.NET Core 2.0 的发布,微软拥有了这个通用、模块化、跨平台开源平台的下一个主要版本,该平台最初发布于 2016 年。在创建过程中,.NET Core包含了.NET Framework 当前版本提供的许多 API。它最初是为了下一代 ASP.NET 解决方案而创建的,但现在,它推动了包括物联网、云和下一代移动解决方案在内的许多其他场景的发展,并成为它们的基础。在这个介绍.NET Core的第二系列中,我们将进一步探讨.NET Core的一些好处,以及它如何使传统的.NET 开发人员以及所有需要为市场提供健壮而又经济的高性能解决方案的技术人员受益。


查看英文原文:Distributed Caching With ASP.NET Core


2018 年 12 月 25 日 11:021227
用户头像

发布了 1008 篇内容, 共 307.1 次阅读, 收获喜欢 272 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

云栖大会CDN技术专场:如何构建企业级内容分发加速体验?

巨侠说

CDN

多方计算——打开区块链应用新场景

CECBC区块链专委会

区块链 大数据

就餐卡系统第一周作业「架构师训练营第 1 期」

天天向善

学习

洞爷湖-安静与灵动

刘旭东

摄影 摄影征文 洞爷湖 北海道

司法区块链破解互联网案件审判难

CECBC区块链专委会

区块链技术 不可篡改 法院

机器学习在滴滴网络定位中的探索和实践

滴滴技术

人工智能 学习 滴滴技术

Vue-防止重复点击指令

老菜鸟

Vue 指令

加速连接效率 阿里云推出5G消息使能平台MEP

巨侠说

同事为进大厂天天刷Java面试题,面试却履败!究其原因竟是它在捣鬼。

Java成神之路

Java 程序员 数据结构 面试 算法

第一周总结

一个节点

极客大学架构师训练营

面试官:谈一下你对DDD的理解?我:马什么梅?

艾小仙

Java 架构 编程语言 领域驱动设计 DDD

拥抱K8S系列-08-通过rancher部署nginx应用

张无忌

nginx Kubernetes rancher

程序员写个人技术博客的价值与意义

Java架构师迁哥

食堂就餐卡系统设计

一个节点

极客大学架构师训练营

微服务 API 网关kong的爬坑之路

Dream

微服务网关 kong

架构师训练营1期第1周:架构方法 - 总结

piercebn

极客大学架构师训练营

阿里云发布边缘计算视频上云解决方案 为海量视图处理提供城市级云基础设施

巨侠说

边缘计算

聚焦2020云栖大会 边缘计算专场畅谈技术应用创新

巨侠说

不正经的计算机专业学生拍摄照片分享

王荣胜

摄影

一周信创舆情观察(8.24~9.13)

统小信uos

第一周作业

Geek_4c1353

极客大学架构师训练营

食堂就餐卡系统UML设计 - 架构师训练营第1周作业

netspecial

极客大学架构师训练营

架构师训练营01周 -- 命题作业

骏马

极客大学架构师训练营

并发+JVM+Redis+MySQL+分布式+微服务等及阿里等大厂最新面试问答

Java成神之路

Java redis spring 面试 JVM

架构方法周总结第一周作业「架构师训练营第 1 期」

天天向善

学习

从构建小系统到架构分布式大系统,Spring Boot2的精髓全在这里了

Java成神之路

Java 编程 程序员 面试 Spring Boot 2

从开源协议到谷歌禁用华为、Docker实体清单事件

艾小仙

GitHub Linux 开源 编程语言 开源许可证

[Go] 设置各种选项的最佳套路

eddix

go 设计模式

非暴力拆解:小熊派NB-IoT通信扩展板

华为云开发者社区

IoT 通信 芯片

Week 1 命题作业

阿泰

云图说 | 通过Helm模板快速部署中间件应用

华为云开发者社区

容器 k8s

在ASP.NET Core应用程序中使用分布式缓存-InfoQ