§缓存机制是用于将数据缓存于内存中,供程序在之后一段时间内取用的机制。
•优点:
§减少对数据源往返读取,保证服务器资源充分利用。一般情况下,在有大量“静态”信息时应用Cache是最有效的,最典型的例子如产品目录等,因为产品目录一经从数据库读出被组织成目录信息后就很少再变动,避免重复读数据库操作。
§快速响应每个用户请求信息,适应大用户量情况。
•缺点:
§当被缓存的数据大到一定程度时,服务器内存资源消耗严重,导致性能下降,严重会出现机器崩溃现象。
§不能用于服务器群集。
§不是随便使用就能显著提高系统性能,主要还需要把握用的尺度,需要在内存空间与数据快速存取之间找到平衡点。
§ASP.net中常用的缓存方式
缓存的过期依赖条件
§页面缓存
•一个例子:查询北京市的天气。因为天气数据在一定的时间内是相对稳定的。当Web程序中第一次查询北京市的天气时,应用程序可能是调用一个远程的WebService获取天气信息。而其后的用户就可以从缓存中得到当前的天气信息。这将大大提高性能,减少服务器的压力。
•方式:
§指明页面使用缓存
§Duration:控制缓存有效的时间,单位为分钟
§VaryByParam:用于指明是否缓存的判断依据。例如,如果第一个用户查询的是北京的天气,则缓存中存储了北京市的天气。当第二个用户查询上海的天气时,为避免读取到错误的缓存,可以用这样的代码缓存多个城市的天气。这就指明了根据页面URL中的cityName参数来缓存多份数据。
§片断缓存
•在ASP.net中,除了在页面范围内使用缓存,也还可以针对User Control使用Output Cache参数实现对用户控件的缓存。同样的,一个页面中相同类型的控件也可以有多个不同的缓存。可以根据参数来实现不同的缓存。
•例如:对于控件可以根据Control 的C属性的不同实现不同的缓存。
§数据缓存
缓存的过期依赖条件
§为了取得缓冲与数据有效性之间的平衡,可以根据需要对缓冲过期策略进行合理的设置。
•文件依赖
Cache.Insert (“Mydata”, Source, New CacheDependency(Server.MapPath(“authors.xml”)))
此代码的含义是当authors.xml文件不发生变化的时候,缓冲MyData始终有效。
•时间依赖
设定1小时后过期,这是一种绝对过期。
Cache.Insert(“Mydata”, Source, null, DateTime.Now.AddHours(1), TimeSpan.Zero);
•相对过期依赖
当DataSet不再发生变化20分钟以后,缓冲过期。
Cache.Insert(“MyData”,Source,null, DateTime.MaxValue, TimeSpan.FromMinutes(20));
§Cache最佳实践
§对较少变动的且又经常用的数据进行Cache是最好的用法。
§不要用Cache保存任何用户特定信息,而应该改用Session替代。Cache保存的数据对Web应用程序里所有用户有效,为类似Application的公有对象。
§使用ASPX页中的OutputCache指令设置页面Cache对整个Web应用程序将有大数量级的性能提高。因此,强烈建议在每个使用情景里,应该尽量考虑使用OutputCache的可能性。
<%@ OutputCache Duration="60" VaryByParam=“None" %>
§OutputCache使用Tips
§<%@ OutputCache Duration="#ofseconds" Location="Any | Client | Downstream | Server | None" Shared="True | False" VaryByControl="controlname" VaryByCustom="browser | customstring" VaryByHeader="headers" VaryByParam="parametername" %>
§Duration:页或用户控件进行缓存的时间(以秒计)。 该属性是必须有的。
§Location:指定输出缓存的位置的有效值。
§Shared:一个布尔值,确定用户控件输出是否可以由多个页共享。
§VaryByCustom:表示自定义输出缓存要求的任意文本。
§VaryByControl:一个分号分隔的字符串列表,用于更改用户控件的输出缓存。
§VaryByHeader:分号分隔的 HTTP 标头列表,用于使输出缓存发生变化。当将该属性设为多标头时,对于每个指定的标头,输出缓存都包含一个请求文档的不同版本。
§VaryByParam:分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用 GET 方法属性发送的查询字符串值对应,或与用 POST 方法发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括 none、* 和任何有效的查询字符串或 POST 参数名称。