第19章 ASP.NET缓存

对于“缓存”这个词语,相信大家都有一定的认识,它是在内存中保存创建代价高的信息副本的一种技术。在系统设计中,通常可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在缓存中,以此来提高系统的性能。例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,为了避免在用户每次请求数据时都需要重新创建报表,可以把这些报表数据存储在缓存中。这样,用户在请求数据时,只需要从缓存中得到自己需要的报表数据,而无须应用程序在每次请求报表数据时来重复处理这些数据。

本章将详细介绍ASP.NET的各种缓存技术,主要学习内容有如下几个方面:

❑输出缓存

❑数据缓存

❑缓存依赖

❑自定义输出缓存提供程序

❑分布式缓存Velocity

19.1 理解ASP.NET缓存

对于缓存,如果妥善使用它,它可以两倍、三倍甚至十倍地提升应用程序的性能,而自己要做的就是将这些重要的数据在缓存中保存一段时间。其实,生成高性能、可缩放的Web应用程序最重要的因素之一就是:能够在首次请求项时将这些项存储在内存中,不管它们是数据对象、页还是页的某些部分。可以将这些项缓存或存储在Web服务器上或请求流中的其他软件上,如代理服务器或浏览器,从而可以使你避免重新创建满足先前请求的信息,尤其是那些需要大量处理器时间或资源的信息。ASP.NET缓存允许你使用多种技术跨HTTP请求存储页输出或应用程序数据并对其进行重复使用。在ASP.NET中,提供了两种可以用来创建高性能Web应用程序的缓存类型。

1.输出缓存

输出缓存在内存中存储处理后的ASP.NET页的内容。这一机制允许ASP.NET向客户端发送页响应,而不必再次经过页处理生命周期。输出缓存对于那些不经常更改,而且还需要大量处理才能创建的页特别有用。例如,如果创建大通信量的网页来显示不需要频繁更新的数据,输出缓存则可以极大地提高该页的性能。可以分别为每个页配置页缓存,也可以在Web.config文件中创建缓存配置文件。利用缓存配置文件,只定义一次缓存设置就可以在多个页中使用这些设置。

在输出缓存中,它又提供了两种页缓存模型:整页缓存和部分页缓存。其中,整页缓存允许将页的全部内容保存在内存中,并用于完成客户端请求;部分页缓存允许缓存页的部分内容,其他部分则为动态内容。

而在部分页缓存中,可以采用两种工作方式:控件缓存和缓存后替换。

控件缓存有时也称为分段缓存,这种方式允许将信息包含在一个用户控件内,然后将该用户控件标记为可缓存的,以此来缓存页输出的部分内容。这一方式可缓存页中的特定内容,并不缓存整个页,因此每次都需重新创建整个页。例如,如果要创建一个显示大量动态内容(如股票信息)的页,其中有些部分为静态内容(如每周总结),可以将静态部分放在用户控件中,并允许缓存这些内容。

缓存后替换与控件缓存正好相反。这种方式缓存整个页,但页中的各段都是动态的。例如,如果要创建一个在规定时间段内为静态的页,则可以将整个页设置为进行缓存。如果向页添加一个显示用户名的Label控件,则对于每次页刷新和每个用户而言,Label的内容都将保持不变,始终显示缓存该页之前请求该页的用户的姓名。但是,使用缓存后替换机制,可以将页配置为进行缓存,但将页的个别部分标记为不可缓存。在此情况下,可以向不可缓存部分添加Label控件,这样将为每个用户和每次页请求动态创建这些控件。

其实,除缓存页的单一版本外,ASP.NET页输出缓存还提供了一些功能,可以创建根据请求参数的不同而不同的页的多个版本。

2.应用程序数据缓存

应用程序数据缓存提供了一种编程方式,可通过键/值对将任意数据存储在内存中。使用应用程序数据缓存与使用应用程序状态类似。但是,与应用程序状态不同的是,应用程序数据缓存中的数据是易失的,即数据并不是在整个应用程序生命周期中都存储在内存中。而使用应用程序数据缓存的优点是由ASP.NET管理缓存,它会在项过期、无效或内存不足时移除缓存中的项。当然,还可以配置应用程序数据缓存,以便在移除项时通知应用程序。

使用应用程序数据缓存的模式是,确定在访问某一项时该项是否存在于缓存中,如果存在,则使用。如果该项不存在,则可以重新创建该项,然后将其放回缓存中。这一模式可确保缓存中始终有最新的数据。