如何在ASP.Net Core使用分布式缓存的实现_实用技巧

来源:脚本之家  责任编辑:小易  

ASP.Net Core 提供了多种类型的缓存,除了内存缓存和响应缓存之外,还提供了对 分布式缓存 的支持。在之前的一篇文章中,我讨论了 ASP.Net Core 的内存缓存。在本文中,我们将讨论如何在 ASP.Net Core 中使用分布式缓存,本篇就拿 Redis 和 SQL Server 作为演示。

什么是分布式缓存

分布式缓存 可用于提高应用程序的性能和可伸缩性,通常 分布式缓存 被多个应用服务器共享,在分布式缓存中,缓存的数据不会落在某些个别的web服务器内存中,这些缓存数据采用集中化存储,这样多个应用服务器都可以直接使用,这样做的好处在于,如果任何一个服务器宕机或者停止响应,其他的服务器仍然能够检索缓存的数据。分布式缓存的另一个优点是,缓存的数据在服务器重启后仍然存在,当你的应用集群扩展时,并不会对缓存服务器造成任何影响。

要想在 ASP.NET Core 中使用分布式缓存,需要用到 IDistributedCache 接口,在下一节中,我们将会一起讨论 IDistributedCache 和 IMemoryCache 接口的区别。

IDistributedCache 接口

在.Net Core 中用于分布式缓存的 IDistributedCache 接口要比 单机版的 IMemoryCache 接口更复杂,先来看一下 IMemoryCache 接口定义。

public interface IMemoryCache : IDisposable
{
  bool TryGetValue(object key, out object value);
  ICacheEntry CreateEntry(object key);
  void Remove(object key);
}

IDistributedCache 接口是为 web farm 场景设计的, 它包含了一组同步和异步方法,可用于对缓存的 Add,Remove,Retrieve 操作,下面是 IDistributedCache 接口的定义。

public interface IDistributedCache
{
  byte[] Get(string key);
  
  Task<byte[]> GetAsync(string key);
  
  void Set(string key, byte[] value, DistributedCacheEntryOptions options);
  
  Task SetAsync(string key, byte[] value, DistributedCacheEntryOptions options);
  
  void Refresh(string key);
  
  Task RefreshAsync(string key);
  
  void Remove(string key);
  
  Task RemoveAsync(string key);
}

有一点值得注意,上面的 Set 方法的 value 仅支持 byte[],有点坑哈,当然你要塞入 string 的话, 不用担心,ASP.NET Core 也提供了扩展方法对其进行支持.

如何使用 Redis 作为缓存介质

可以通过 Nuget 来安装如下扩展包,代码如下:

Install-Package Microsoft.Extensions.Caching.Redis

为了能够把 Redis 作为应用底层缓存,需要使用 AddDistributedRedisCache() 扩展方法,下面的代码展示了如何去配置:

public void ConfigureServices(IServiceCollection services)
{
   services.AddMvc();
   services.AddDistributedRedisCache(option =>
   {
     option.Configuration ="localhost";
     option.InstanceName ="IDG";
   });
}

如何注入到 Controller

下面的代码清单展示了如何将 IDistributedCache 注入到 Controller 中并实现从 Redis 中进行插入和读取。

public class DefaultController : Controller
{
   private readonly IDistributedCache _distributedCache;
   
   public HomeController(IDistributedCache distributedCache)
   {
     _distributedCache = distributedCache;
   }

   [HttpGet]
   public async Task<string> Get()
   {
     var cacheKey ="IDG";

     var data = _distributedCache.GetString(cacheKey);
     
     if (!string.IsNullOrEmpty(data))
     {
        return data; //returned from Cache
     }
     else
     {
        string str ="Hello World";
        _distributedCache.SetString(cacheKey, str);
        return str;
     }
   }
}

如何使用 SqlServer 作为缓存介质

要想将 SqlServer 作为底层的缓存介质,需要通过 Nuget 安装如下包:

Install-Package Microsoft.Extensions.Caching.SqlServer
Install-Package Microsoft.Extensions.Caching.SqlConfig.Tools

如何在 Startup.ConfigureServices() 中做如下配置。

    public void ConfigureServices(IServiceCollection services)
    {
      services.AddControllersWithViews();

      services.AddDistributedSqlServerCache(x =>
      {
        x.ConnectionString = Configuration["ConnectionStrings:Default"];
        x.SchemaName = "dbo";
        x.TableName = "IDGCache";
      });
    }

接下来通过如下命令在 SqlServer 中生成 Table 来存放缓存数据,代码如下:

dotnet sql-cache create <connection string> <schema> <table>

ASP.Net Core 提供了分布式缓存的高层抽象。因此,无论底层缓存介质是 Redis 还是 SQL Server, IDistributedCache接口都提供了统一并且便捷的操控Cache的API,而且 IDistributedCache 注入到 Controller 中也是非常方便的。

译文链接:https://www.infoworld.com/article/3262990/how-to-implement-a-distributed-cache-in-aspnet-core.html

到此这篇关于如何在ASP.Net Core使用分布式缓存的实现的文章就介绍到这了,更多相关ASP.Net Core 分布式缓存内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

您可能感兴趣的文章:Asp.net Core 3.1基于AspectCore实现AOP实现事务、缓存拦截器功能ASP.NET Core中的Http缓存使用详解Asp.Net Core 2.1+的视图缓存(响应缓存)ASP.NET Core缓存静态资源示例详解详解ASP.NET Core 中间件之压缩、缓存

  • 本文相关:
  • asp.net core web中使用appsettings.json配置文件的方法
  • .net 操作 postgresql遇到的问题
  • asp.net url传递后地址栏乱码(中文超过两个汉字)
  • asp.net图片上传实例
  • asp.net 2.0 中的url重写以及urlmappings问题
  • 将freetextbox做成控件添加到工具箱中的具体操作方法
  • asp.net 仿腾讯微薄提示 还能输入*个字符 的实现代码
  • c# 邮件地址是否合法的验证
  • 用.net做动态域名解析的方法示例
  • asp.net page函数调用顺序解析
  • 如何使用redis实现分布式缓存具体代码操作
  • 请问:ASP.net mvc5和asp.net.core有什么区别呢?在...
  • 如何在ASP NET Core中实现CORS跨域
  • ASP.net mvc5和asp.net.core有什么区别呢?前景如何?
  • 如何安装aspnetcoremodule
  • aspnetcore2使用IdentityServer4完成分布式部署认...
  • 如何在.net core中使用ef
  • Asp.netCore怎么启停本地服务
  • 如何在asp.net中实现将条形码数据输入到数据库中?...
  • 如何在ASP.NET MVC中实现报表打印和导出
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧asp.net core 3.1基于aspectcore实现aop实现事务、缓存拦截器功能asp.net core中的http缓存使用详解asp.net core 2.1+的视图缓存(响应缓存)asp.net core缓存静态资源示例详解详解asp.net core 中间件之压缩、缓存asp.net core web中使用appsettings.json配置文件的方法.net 操作 postgresql遇到的问题asp.net url传递后地址栏乱码(中文超过两个汉字)asp.net图片上传实例asp.net 2.0 中的url重写以及urlmappings问题将freetextbox做成控件添加到工具箱中的具体操作方法asp.net 仿腾讯微薄提示 还能输入*个字符 的实现代码c# 邮件地址是否合法的验证用.net做动态域名解析的方法示例asp.net page函数调用顺序解析未将对象引用设置到对象的实例 (java正则表达式 pattern和matcheasp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net对路径"xxxxx"asp.net汉字转拼音和获取汉字首字c# web api返回类型设置为json的两种方法有潜在危险的 request.form 值避免方法利用aspose.cells实现万能导出功能.net基础之自定义泛型分析asp.net executenonquery()返回值介绍asp.net core集成mongodb的完整步骤asp.net gridview的rowcommand命令中获取asp.net c#检查url是否有效的方法关于ddd:管理"工作单元实例"的删除datatable重复列,只删除其中的一列重
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved