ASP.NET的持续文件系统磁盘缓存

摘要:https://www.codeproject.com/articles/12097/cache-management-in-asp-net
使用不同的术语来解释相同的概念,即管理数据。有些人将其称为国家管理,另一些人则称其为缓存管理。我喜欢“缓存”一词。但是从概念上讲,这两个之间没有区别。
现在,让我们讨论ASP.NET中缓存管理(或状态管理)的不同方面。
尽管在Windows应用程序中,缓存管理不是问题,但在Web环境中一直是一个挑战。由于HTTP是一种无状态协议,Web服务器在不同请求之间无法识别用户,因此对于我们在不同请求之间识别特定用户并存储数据非常重要,以便可以在不同的请求之间重复使用。 ASP.NET提供了许多用于在客户端(浏览器)和服务器(Web服务器)侧存储数据的功能,但有时我们会与何时使用的数据混淆。在ASP.NET中,我们遇到了会话,应用程序和缓存对象之类的功能,但是对于我们来说,了解它们之间的差异很重要,以便在Web应用程序中有效使用它们。
在本文中,我将介绍ASP.NET中可用的不同缓存管理选项。在Web应用程序中,有时我们需要将数据存储在服务器端,以避免数据存储中的昂贵数据检索操作以及耗时的数据格式格式逻辑以提高应用程序性能,并在跨用户,应用程序和机器的后续请求中重新使用相同的数据。因此,为了实现这一目标,我们需要将(缓存)数据存储在服务器端。
缓存有助于我们实现QoS的三个重要方面(服务质量):
ASP.NET提供了一个称为应用程序对象的对象来存储所有用户请求可访问的数据。该对象的寿命与应用程序相关,并且每次应用程序启动时都会重新创建。与ASP.NET会话对象不同,所有用户请求都可以访问此对象。由于此存储是在应用程序域空间中创建和维护的,因此不应将其用于网络农场场景中的数据存储。此选项对于存储像应用程序元数据(配置文件数据)之类的数据非常有用,该数据可以在应用程序启动过程中加载到应用程序对象,并且可以在应用程序的寿命中使用,而无需每次为每个用户请求重新加载它。但是,如果需要在应用程序运行时进行配置文件的任何更改时,需要将缓存的数据无效,则不应使用此选项,因为它不提供任何功能来过期缓存的数据。因此,在这种情况下,应使用其他选项,例如ASP.NET缓存对象,如下所述。
ASP.NET提供了一个键值对对象 - System.Web.Caching名称空间中可用的缓存对象。它的范围是应用域,寿命与应用程序相关。与ASP.NET会话对象不同,所有用户请求都可以访问此对象。
尽管应用程序和高速缓存对象看起来都相同,但它们之间的关键差异是缓存对象提供的添加功能,例如到期策略和依赖关系。这意味着可以根据应用程序代码设置的一些预定时间限制或更改依赖性实体时,可以根据某些预定的时间限制过期/删除存储的数据,而此功能在应用程序对象中不可用。
让我们讨论不同的到期政策和所支持的依赖关系。
依赖关系意味着当依赖实体更改时,可以从缓存中删除项目。因此,可以在从缓存中删除的项目定义因关系,取决于依赖。 ASP.NET中支持两种类型的依赖项。
示例:在我的应用程序中说,我正在使用XML文件存储错误详细信息(错误号码和错误消息映射),该详细信息用于检索运行时给定错误号的错误消息。因此,与其每次需要错误消息中读取磁盘的文件,不如说我决定在应用程序启动时加载一次,然后将其存储在ASP.NET缓存中以供进一步使用。因此,如果我需要更改配置文件以添加新的错误消息或在应用程序运行时更改某些现有错误消息,那么我的缓存数据将会发生什么?我需要停止应用程序并重新启动以反映应用程序中的文件更改吗?答案是否定的。每当使用文件依赖项选项更改文件时,缓存数据就会无效。
到期政策制定了缓存中的项目如何以及何时到期的策略。
.NET远程Singleton对象与多个客户端共享同一实例,因此Singleton对象可用于在不同的客户端调用之间存储和共享数据。由于可以在流程和机器之外使用.NET远程装饰,因此当我们想缓存数据并在服务器和用户之间共享它时,此选项非常有用。在这种方法中,我们可以将数据存储为singleton远程对象的成员变量,并提供读取和保存数据的方法。但是,在实施此功能时,我们需要确保垃圾收集器不会破坏用作缓存的远程对象。为此,我们将不得不将远程缓存对象的租赁期设置为无限,以使租赁期永远不会淘汰。我们可以通过覆盖元帅的初始imifetimeservice方法来做到这一点,然后从该方法中返回null。但是这种方法的唯一问题是性能。正如分析所说,与其他方法相比,这种方法的性能非常差。无论如何,要由应用程序设计人员/开发人员分析不同的选项并使用适合要求的最佳选项。
你们都知道什么是内存映射的文件。它基本上是要将磁盘上的文件映射到应用程序的过程地址空间中的特定地址范围。此选项允许不同的过程通过提高应用程序性能来使用相同的数据。由于使用内存映射的文件在.NET开发人员中并不是很受欢迎,因此我个人不会建议这种方法,因为实施此方法涉及很多复杂性,并且.NET Framework不支持此方法。但是,如果有人对使用这种方法非常感兴趣,那么他们将必须根据自己的要求开发自己的自定义解决方案。
我们使用静态变量在全球存储数据或对象,以便可以在应用程序的生命中访问它们。同样,在ASP.NET中,我们可以使用静态对象进行缓存数据,还可以提供检索和保存数据到缓存的方法。由于静态变量存储在过程区域中,因此性能方面的速度更快。但是,由于在发生静态变量的情况下,实施到期策略和依赖项非常困难,因此我通常更喜欢ASP.NET缓存对象而不是此选项。另一个问题是自定义静态缓存对象必须是线程安全,必须仔细实现。
我们还可以使用数据库来存储数据并在用户和计算机上共享数据。当我们想缓存大量数据时,这种方法非常有用。由于性能,使用这种方法来存储少量数据并不是一个好主意。对于存储少量数据,我们应该选择其他ASP.NET中心内的缓存机制。由于需要将数据存储在数据库中,因此所有对象都需要序列化,以便易于存储和检索。我们还可以使用.NET框架中可用的其他类型的序列化格式。
有时,在我们的应用程序中,在某些页面中,输出通常不会在特定时间段内发生变化。例如,在人力资源网站中,员工的薪水细节不会频繁变化,并且一个月只有一次变化。通常,它仅在每个月的第一天更改。因此,在一个月内,“薪水详细信息”页面将为特定员工显示相同的详细信息。因此,在这种情况下,最好在服务器中某个地方缓存页面以避免业务计算处理,调用数据库和页面渲染逻辑,每次员工希望看到他的薪水详细信息时。我认为,是的!这是一个很好的主意。为了实现这一目标,ASP.NET提供了一个功能,可以在特定时间段内存储页面输出。它还提供了存储页面片段的功能,该片段称为页面片段缓存。
有时,我们可能需要在客户端缓存数据或页面以提高应用程序性能。使用此机制减少了服务器上的负载,但是当我们在客户端缓存数据时,该机制存在一些安全问题。
cookie是一个客户端存储,每个请求都发送到服务器,也从服务器回复。由于其尺寸限制,它应用于存储少量数据。可以为cookie设定到期政策以使一定时间后的项目无效。
ASP.NET ViewState仅在WebForms(而不是MVC)中的一个概念,其中与页面和控件相关的数据存储在生成的页面(客户端端)中。它保留了对服务器多个请求的值。 ViewState在ASP.NET中的加密隐藏字段内在内部实现。 ViewState不应用于存储大量数据,因为它将用于每个请求的服务器。
隐藏字段与页面中的任何其他控件相似,但是此控件的可见状态始终是错误的。像ViewState一样,我们不应将其用于存储大量数据。隐藏帧可用于在客户端缓存数据,但请注意,所有Internet浏览器都不支持隐藏帧。
Internet浏览器为客户端的缓存页面提供了缓存机制。可以使用添加到页面标头的有效指令或通过在Web服务器中手动设置该指令来设置此设置。我们应该将此选项用于客户端的静态页面,脚本,CS和图像。
由JavierCañon制成的。