📜  ASP.NET MVC 缓存

📅  最后修改于: 2022-05-13 01:56:14.453000             🧑  作者: Mango

ASP.NET MVC 缓存

缓存是数据存储,就像数据库一样,但略有不同的是缓存存储,它的数据在内存中,因此它不与文件系统交互。它还将数据存储在非常简单的结构中,例如键值对。因此,他们在编写时不必执行复杂的查询来收集数据和维护索引。由于这个原因,缓存比数据库性能更高

使用缓存的原因,

  • 提高应用程序的性能,因为缓存中的数据存在于内存中。
  • 缓存可以增加应用程序的正常运行时间,因为如果您的数据库无法访问,它仍然存在。

但在应用缓存属性之前,您应该考虑一下。

第一件事是您应该仔细选择要添加到缓存中的数据,例如假设您正在缓存每毫秒更新一次的数据,那么缓存该类型的数据没有意义,因此通常您应该缓存数据经常访问并且不经常更改。

我们可以在 asp.net MVC 中使用输出缓存属性来实现此功能。

在本文中,您将学习如何缓存从控制器操作返回的输出,以便新用户无需在每次调用操作时创建相同的内容。

使用OutputCache属性,您可以通过应用单个控制器操作或整个控制器类来启用输出缓存功能。

那么我们来一一看看OutputCache的属性:

持续时间:它表示用户输出缓存的时间(以秒为单位)。属性值:Int32

句法:

[OutputCache(Duration=Specify_time)]

示例:让我们看一个示例:

C#
using System.Web.Mvc;
  
namespace Caching_DataDemo.Controllers {
    public class CacheController : Controller {
        // GET: Cache
        [OutputCache(Duration = 20)]
            public ActionResult GetDate() {
            return View();
        }
    }
}


HTML
@{
    Layout = null;
}
  

GetDate

    

The Current time :        @DateTime.Now.ToString("dddd, dd MMMM yyyy HH:mm:ss")



C#
using System.Web.Mvc;
  
namespace Caching_DataDemo.Controllers {
    public class CacheController : Controller
    {
        // GET: Cache
        [OutputCache(Duration = 20, 
            Location = OutputCacheLocation.Server)]
        public String GetIdentityofUser()
        {
            return "Good Morning !" + User.Identity.Name;
        }
    }
}


C#
[OutputCache(Duration = int.MaxValue, VaryByParam = "id")]
public ActionResult DetailsOfProduct(int? id)
{
    Product item = db.Products.Find(id);
    return View(item);
}


XML

    
        
            
        
    


C#
using System;
using System.Web.Mvc;
  
namespace MvcApplication.Controllers
{
    public class ProfileController : Controller
    {
        [OutputCache(CacheProfile="TimeCacheProfile")]
        public string Index()
        {
            return DateTime.Now.ToString("dddd, dd MMMM yyyy HH:mm:ss");
        }
    }
}


正如您在上面的代码片段中看到的,我们在控制器操作级别启用了输出缓存。它将输出缓存了 20 秒。

如果您通过在浏览器中输入 URL /Cache/GetDate并反复单击浏览器中的刷新按钮多次调用GetDate()操作,则GetDate视图显示的时间在 20 秒内不会改变。同时显示输出,因为视图被缓存。

您可以通过指定时间将输出缓存 1 天,但是当内存资源不足或下降时,缓存会开始自动清除内容,因此无法保证内容将在您指定的时间内缓存。

HTML

@{
    Layout = null;
}
  

GetDate

    

The Current time :        @DateTime.Now.ToString("dddd, dd MMMM yyyy HH:mm:ss")

GetDate 视图只显示当前时间。

现在的问题是这些缓存内容实际上存储在哪里。当我们使用 [OutputCache] 属性时,内容缓存在OutputCacheLocation枚举中定义的位置。

您可以通过修改 [OutputCache] 的 location 属性将数据缓存在任何位置。

位置:属性值:字符串。您可以设置的位置属性值:

  1. 任何:默认情况下考虑此值。在这种情况下,内容缓存在以下三个位置中的任意一个:Web 服务器(处理请求的位置)、任何代理服务器(请求中涉及的其他服务器)和 Web 浏览器(生成请求的位置) .
  2. 客户端:在这种情况下,输出缓存将存储在发起请求的浏览器客户端上。
  3. 服务器:在这种情况下,输出缓存将存储在处理请求的服务器上。
  4. 无:在这种情况下,将对请求的网页禁用输出缓存
  5. 服务器和客户端:在这种情况下。输出缓存将存储在源服务器或请求客户端

默认的位置值,属性是Any 。可能存在某些情况,您希望在该场景中将数据缓存在特定位置,您可以使用此属性。

让我们考虑一种情况,

C#

using System.Web.Mvc;
  
namespace Caching_DataDemo.Controllers {
    public class CacheController : Controller
    {
        // GET: Cache
        [OutputCache(Duration = 20, 
            Location = OutputCacheLocation.Server)]
        public String GetIdentityofUser()
        {
            return "Good Morning !" + User.Identity.Name;
        }
    }
}

好吧,如您所见,在上面的代码中,我们在服务器级别缓存用户身份数据 20 秒。在代码片段中,有一个控制器,即CacheController ,其操作方法名称为GetIdentityofUser() ,它返回带有当前登录用户身份的问候消息。

现在,如果一个人喜欢考虑名称 Lucifer 登录到该网站并调用 GetIdentityofUser() 则该操作返回“早安! Lucifer ” 。在指定的缓存持续时间之间,其他人随后登录网站,然后该人将获得相同的字符串输出,因为该字符串被缓存在服务器级别。

[OutputCache(Duration =20,Location=OutputCacheLocation.Server)]

注意:切勿在服务器缓存中缓存个性化内容。

您可能希望在浏览器缓存中缓存个性化内容以提高性能。如果您在浏览器中缓存内容,并且用户多次调用相同的控制器操作,则可能会从浏览器缓存而不是服务器中检索内容。

让我们修改一下,只需简单地将输出缓存位置服务器替换为客户端,这样它就只会在浏览器上缓存输出。

[OutputCache(Duration =20,Location=OutputCacheLocation.Client)]

现在,每个用户都将获得自己的身份。

NoStore:指示是否启用辅助存储。其默认值设置为 False。属性值:布尔类型。

我们还可以添加 NoStore 属性。 NoStore 属性用于通知代理服务器和浏览器它们不应存储缓存内容的永久副本。

[OutputCache(Duration =20, Location=OutputCacheLocation.Client, NoStore=true)]

VarByParam: Varying the Output Cache:用于根据输入参数通过使用实现输出的不同缓存版本。

考虑一个场景,假设我们有一个名为ProductRecordController的控制器,它有一个操作方法DetailsOfProduct ,它根据 id 显示产品的详细信息。这意味着此方法将 id 作为输入参数,并根据该 id 参数显示产品的信息。现在我们要根据输入参数创建产品详细信息视图的不同缓存版本。

让我们实现它,

C#

[OutputCache(Duration = int.MaxValue, VaryByParam = "id")]
public ActionResult DetailsOfProduct(int? id)
{
    Product item = db.Products.Find(id);
    return View(item);
}

正如您在代码中看到的,id 参数设置为VaryByparam属性,因此现在每个不同的 Id 参数值都传递给控制器操作,生成了DetailsOfProduct视图的不同缓存版本。

Cacheprofile:这实际上是另一种定义输出缓存属性的方法,你可以在web.config文件中创建一个缓存配置文件。

OutputCacheProfile:它是一个集中的对象,我们在其中配置经常访问的设置,例如缓存位置和过期时间等。

这种方法提供了一些优势。

首先,中央缓存控制。只需在 Web 配置文件中创建缓存配置文件即可。您可以将配置文件应用于多个控制器或控制器操作。不是在多个地方定义相同的代码,而是重复生成的代码。

其次,您无需重新编译即可轻松修改您的配置文件。如果您需要为已经部署到生产的应用程序禁用它,那么您也可以简单地修改 Web 配置文件中定义的缓存配置文件。我们对 Web 配置文件所做的任何更改都将被自动检测并应用。

示例:让我们看一下示例:

XML


    
        
            
        
    

在这里,您可以看到我们在配置文件的缓存部分的OutputCacheProfiles部分的add元素中添加了配置。

C#

using System;
using System.Web.Mvc;
  
namespace MvcApplication.Controllers
{
    public class ProfileController : Controller
    {
        [OutputCache(CacheProfile="TimeCacheProfile")]
        public string Index()
        {
            return DateTime.Now.ToString("dddd, dd MMMM yyyy HH:mm:ss");
        }
    }
}

我已经使用OutputCacheCacheProfile属性将该配置文件应用于控制器操作

OutputCache(CacheProfile="TimeCacheProfile")]

如果您运行代码,则当前时间日期将保持 30 秒不变,因为我们在缓存配置文件中将持续时间属性设置为 30 秒。所以它会将内容缓存 30 秒。

最后,您了解了如何以及何时在 ASP.NET MVC 中使用 OutputCache 属性