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/web-development/how-to-implement-a-distributed-cache-in-aspnet-core.html

如何在 ASP.Net Core 使用 分布式缓存相关推荐

  1. 如何在 ASP.Net Core 使用 内存缓存

    ASP.NET Core 是一个轻量级,模块化的框架,常用来在 Windows,Linux 和 MacOS 上构建高性能,现代化的web框架,不像过去的 Asp.NET,在 ASP.NET Core ...

  2. 如何在 ASP.NET Core 中使用 LazyCache

    微软的 ASP.NET Core 已经是一个非常流行的用于构建 高性能, 模块化 并能运行在 Windows, Linux, MacOS 上的 WEB 框架,通常能够让程序保持高性能的一个有效途径就是 ...

  3. 如何在 ASP.Net Core 中使用 NCache

    虽然 ASP.Net Core 中缺少 Cache 对象,但它引入了三种不同的cache方式. 内存缓存 分布式缓存 Response缓存 Alachisoft 公司提供了一个开源项目 NCache, ...

  4. 如何在ASP.NET Core程序启动时运行异步任务(3)

    原文:Running async tasks on app startup in ASP.NET Core (Part 3) 作者:Andrew Lock 译者:Lamond Lu 之前我写了两篇有关 ...

  5. 如何在 ASP.NET Core 中使用 HttpClientFactory ?

    ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...

  6. 如何在 Asp.Net Core 中对请求进行限流

    译文链接:https://www.infoworld.com/article/3442946/how-to-implement-rate-limiting-in-aspnet-core.html 在应 ...

  7. 如何在ASP.NET Core程序启动时运行异步任务(2)

    原文:Running async tasks on app startup in ASP.NET Core (Part 2) 作者:Andrew Lock 译者:Lamond Lu 在我的上一篇博客中 ...

  8. [第二篇]如何在ASP.Net Core的生产环境中使用OAuth保护swagger ui

    在我上篇文章如何在ASP.Net Core的生产环境中保护swagger ui中,我们讨论了如何使用基本身份验证来保护 swagger ui. 使用 OAuth 2.0 和 OpenIdConnect ...

  9. NET问答: 如何在 ASP.NET Core 的 .json 文件中读取 AppSettings ?

    咨询区 Oluwafemi: 在 appsettings.json 中我有如下的 AppSettings 实体数据,如下代码所示: {"AppSettings": {"t ...

最新文章

  1. 一个北京小网编从1000块起家的网络直销故事
  2. glassfish_多种监视和管理GlassFish 3的方法
  3. 剖析云平台中的“共享型数据库”
  4. html中在线预览pdf文件之pdf在线预览插件
  5. 100层楼扔2个鸡蛋、3个鸡蛋……
  6. 摩托罗拉edge X30屏下版真机首曝:四边等宽 屏下显示效果出众
  7. 深度学习基础(八)—— 稀疏自编码器
  8. Mac osx 技巧
  9. C/C++中struct/union/class内存对齐
  10. 秒杀系统的核心点都在这里,快来取
  11. 【jzoj5335】早苗
  12. 喜羊羊与灰太狼java_java swing实现喜羊羊与灰太狼推箱子游戏附带视频开发教程...
  13. win7查看隐藏文件夹
  14. 利用windows事件管理器定位程序闪退错误
  15. 基于MATLAB的线性规划:linprog用法
  16. java树结构stream工具类
  17. Java日期时间的设置问题
  18. python socket发包_python 多线程tcp udp发包 Dos工具。
  19. 英语作文计算机国际会议开幕词,学术会议开幕词英文.doc
  20. 类各种成员的访问权限 及 友员类和友员函数

热门文章

  1. Arrays.asList 使用细节
  2. python---[列表]lsit
  3. webpack之DefinePlugin使用
  4. 将字符串分割为指定长度的子字符串
  5. 【原创】请避免GO语言中的携程空跑(CPU突然激增)
  6. 开发Android应用 提升性能的小技巧
  7. 笔试题 遗忘点记录 面向对象特点 + 产生死锁条件+ windows内存管理方法
  8. POJ1269 Intersecting Lines 计算几何 C语言
  9. 详谈如何定制自己的博客园皮肤【转】
  10. 你一写长文章就焦虑拖延?