【问题标题】:Cache entire response to distributed cache (Redis)将整个响应缓存到分布式缓存 (Redis)
【发布时间】:2018-11-23 12:28:16
【问题描述】:

我想将整个页面缓存到 ASP.NET Core 2.1 MVC Web 应用程序中的分布式缓存(特别是 Redis)。当用户访问一个页面时,执行action方法和视图cshtml中的代码,生成一个页面并发送给用户。我希望这个页面在请求结束时被缓存,这样当后续用户访问该页面时,它应该从缓存中呈现出来,而不必在操作方法或视图中执行任何代码。更具体地说,我希望它被缓存在 Redis 中。我熟悉如何从 Web 应用程序在 Redis 中存储键值对,也熟悉如何将部分页面缓存到 Redis,但我不知道如何缓存 整个 页面到 Redis。

我已成功使用IDistributedCache 接口的Redis 特定实现将键值对存储到Redis。这是通过安装 Microsoft.Extensions.Caching.Redis.Core NuGet 包并将以下语句添加到 ConfigureServices() 来实现的:

services.AddDistributedRedisCache(options =>
{
    options.Configuration = "localhost";
    options.InstanceName = "SampleInstance";
});

完成后,我可以将 Redis IDistributedCache 实现依赖注入到控制器中,然后使用 _cache.GetStringAsync()_cache.SetStringAsync() 之类的语句将键值对存储和检索到 Redis。我还可以在 .cshtml 页面中使用 <distributed-cache> 标签助手来缓存视图的一部分。

但是这些技术并不能帮助我缓存整个页面,只缓存其中的一部分。动作和视图中的代码仍然需要执行,并且页面需要重新渲染,尽管速度更快,因为其中一些被缓存了。我想做的是缓存 整个 页面,这样就可以从缓存中提供所有内容,而无需执行 action 方法和视图 cshtml 中的代码。

我还知道如何在 ASP Core 2.1 中使用内置功能来完成基本的页面缓存。只需在操作方法中添加[ResponseCaching(Duration=...)] 属性,在Startup.cs 中分别将services.AddResponseCaching()app.UseResponseCaching() 语句添加到ConfigureServices()Configure()不幸的是,页面被缓存在服务器实例上,大概在服务器的内存中。我不知道如何告诉它在 Redis 中缓存这个页面。

基本上我想要[ResponseCaching(Duration=..., CACHE=REDIS)] 之类的东西。如何做到这一点?


旧 ASP.NET 4 等效项

在 ASP.NET 4 中,只需将 [OutputCache(Duration=...)] 属性添加到操作,安装 Microsoft.Web.RedisOutputCacheProvider NuGet 包,并将以下内容放入 web.config

<caching>
    <outputCache defaultProvider="MyRedisOutputCache">
       <providers>
          <add name="MyRedisOutputCache" type=... host="" ssl="true" />
       </providers>
    </outputCache>
</caching>

随后整个页面将被缓存到 Redis。这真的很简单。这正是我试图在 ASP Core 2.1 中复制的功能。

【问题讨论】:

标签: caching asp.net-core redis asp.net-core-mvc asp.net-core-2.0


【解决方案1】:

您可以使用 ASP.NET MVC 操作过滤器。

覆盖 OnResultExecuted 以将最终结果存储在 Redis 缓存中。

检查 OnActionExecuting 中是否存在缓存。

在 html 视图准备好后调用 OnResultExecuted,因此您可以存储渲染的 html。

在操作之前调用 OnActionExecuting,以便您可以从缓存中加载数据。 检查link 中的 ASP.NET MVC 操作过滤器。

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 2016-01-11
    • 2017-09-28
    • 2010-10-25
    • 2014-10-26
    • 1970-01-01
    • 2021-07-01
    • 2012-03-15
    • 2011-03-11
    相关资源
    最近更新 更多