当前位置: 首页 > news >正文

在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(\u0026quot;api/get\u0026quot;)]public string Get(){    // 生成一个新字符串    var myString = Guid.NewGuid() + \u0026quot; \u0026quot; + 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 =\u0026gt;{    opt.Servers = new List\u0026lt;Uri\u0026gt;    {        new Uri(\u0026quot;http://localhost:8091\u0026quot;)    };    opt.Username = \u0026quot;infoq\u0026quot;;    opt.Password = \u0026quot;password\u0026quot;;});services.AddDistributedCouchbaseCache(\u0026quot;infoqcache\u0026quot;, opt =\u0026gt; { });

(在文件顶部,我还添加了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(\u0026quot;api/getfast\u0026quot;)]public string GetUsingCache(){    // 这个字符串是否已经在缓存中?    var myString = _cache.GetString(\u0026quot;CachedString1\u0026quot;);    if (myString == null)    {        // 字符串不在缓存中        // 生成一个新字符串        myString = Guid.NewGuid() + \u0026quot; \u0026quot; + DateTime.Now;        // 等待5秒(模拟一个缓慢的操作)       Thread.Sleep(5000);        // 把字符串放入缓存       _cache.SetString(\u0026quot;CachedString1\u0026quot;, myString);        // 只缓存5分钟        /*        _cache.SetString(\u0026quot;CachedString1\u0026quot;, 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(\u0026quot;CachedString1\u0026quot;, 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

相关文章:

  • WinForm中TextBox 中判断扫描枪输入与键盘输入
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 编写HTML和CSS几点心得
  • 常见高并发案例
  • HDU 1087 Super Jumping! Jumping! Jumping!
  • 一篇文章,教你学会Git
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • mac jdbc连接mysql
  • Linux运维之--LVS、Nginx、HAproxy有什么区别?
  • LFS,编译自己的Linux系统 - 编译临时系统
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • 构造字符串 之 hdu 4850 Wow! Such String!
  • Nginx负载均衡demo
  • Mysql 字符串截取
  • Go语言的序列化与反序列化(gob)
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 03Go 类型总结
  • 11111111
  • C++11: atomic 头文件
  • Gradle 5.0 正式版发布
  • LintCode 31. partitionArray 数组划分
  • Material Design
  • MYSQL 的 IF 函数
  • nginx 配置多 域名 + 多 https
  • PAT A1017 优先队列
  • Shell编程
  • Swoft 源码剖析 - 代码自动更新机制
  • 面试总结JavaScript篇
  • 思否第一天
  • 通过几道题目学习二叉搜索树
  • 小李飞刀:SQL题目刷起来!
  • 携程小程序初体验
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #单片机(TB6600驱动42步进电机)
  • $(selector).each()和$.each()的区别
  • (1)(1.13) SiK无线电高级配置(五)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (pojstep1.3.1)1017(构造法模拟)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (未解决)macOS matplotlib 中文是方框
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (轉)JSON.stringify 语法实例讲解
  • ***详解账号泄露:全球约1亿用户已泄露
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core 中的路径问题
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET性能优化(文摘)