博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】系统缓存全解析二:动态缓存(1)-传统缓存 与 页面输出缓存
阅读量:4311 次
发布时间:2019-06-06

本文共 5379 字,大约阅读时间需要 17 分钟。

下面详细介绍在《系统缓存全解析一》中提及的动态缓存技术:

一,传统缓存方式:

比如将可重复利用的东西放到Application或是Session中去保存。

Session["Style"] =
val;
Application["Count"] = 0;

 

二,页面输出缓存:全页缓存到服务器内存中

    

页面输出缓存是最为简单的缓存机制,该机制将整个ASP.NET页面内容保存在服务器内存中。当用户请求该页面时,系统从内存中输出相关数据,直到缓存数据过期。在这个过程中,缓存内容直接发送给用户,而不必再次经过页面处理生命周期。通常情况下,页面输出缓存对于那些包含不需要经常修改内容的,但需要大量处理才能编译完成的页面特别有用。需要读者注意的是,页面输出缓存是将页面全部内容都保存在内存中,并用于完成客户端请求。

在ASP.NET中页面缓存的使用方法非常的简单,只需要在aspx页的顶部加这样一句声明即可:

<%@ OutputCache
Duration="60" VaryByParam="none" %>

 

Duration

缓存的时间(秒)。这是必选属性。如果未包含该属性,将出现分析器错误。

ExpandedBlockStart.gif
View Code
 1 
<%
@ Page 
 2 
Language
=
"
C#
"
 AutoEventWireup
=
"
true
"
 CodeBehind
=
"
WebForm1.aspx.cs
"
 
 3 
Inherits
=
"
CacheWebApp._16_4_3.WebForm1
"
 
%>
 4 
 5 
<%
@ OutputCache 
 6 
Duration
=
"
60
"
 VaryByParam
=
"
none
"
 
%>
 7 
 8 
<
html 
 9 
xmlns
="http://www.w3.org/1999/xhtml"
 
>
10 
11 
<
head 
12 
runat
="server"
>
13 
14 
<
title
>页面缓存示例
</
title
>
15 
16 
</
head
>
17 
18 
<
body
>
19 
20 
<
form 
21 
id
="form1"
 runat
="server"
>
22 
23 
<
div
>
24 
25 
<
asp:Label 
26 
ID
="Label1"
 runat
="server"
 
27 
Text
="Label"
></
asp:Label
>
28 
29 
</
div
>
30 
31 
</
form
>
32 
33 
</
body
>
34 
35 
</
html
>

后台代码:

ExpandedBlockStart.gif
View Code
 1 
protected 
 2 
void Page_Load(
object sender, EventArgs e)
 3 
 4 {
 5 
if 
 6 (!IsPostBack)
 7 
 8 {
 9 Label1.Text = 
10 DateTime.Now.ToString();
11 
12 }
13 
14 }

如果不加<%@ OutputCache
Duration="60" VaryByParam="none"
%>,每次刷新页面上的时间每次都是在变。而加了缓存声明以后,每次刷新页面的时间并不变化,60秒后才变化一次,说明数据被缓存了60秒。
VaryByParam
是指页面根据使用
POST 或 GET 发送的名称/值对(参数)来更新缓存的内容,多个参数用分号隔开。如果不希望根据任何参数来改变缓存内容,请将值设置为
none。如果希望通过所有的参数值改变都更新缓存,请将属性设置为星号 (*)。
例如:
http://localhost:1165/16-4-3/WebForm1.aspx?p=1
则可以在WebForm1.aspx页面头部声明缓存:<%@
OutputCache Duration="60" VaryByParam="p"
%>
以上代码设置页面缓存时间是60秒,并根据p参数的值来更新缓存,即p的值发生变化才更新缓存。
如果一直是WebForm1.aspx?p=1访问该页,则页面会缓存当前数据,当p=2时又会执行后台代码更新缓存内容。
如果有多个参数时,如:http://localhost:1165/16-4-3/WebForm1.aspx?p=1&n=1
可以这样声明:<%@
OutputCache Duration="60" VaryByParam="p;n" %>
除此之外,@OutputCache
还有一些其他的属性。@OutputCache指令中的属性参数描述如下:
<%@ OutputCache
Duration="#ofseconds"
Location="Any | Client | Downstream | Server | None
|
ServerAndClient "
Shared="True |
False"
VaryByControl="controlname"
VaryByCustom="browser |
customstring"
VaryByHeader="headers"
VaryByParam="parametername"
CacheProfile="cache
profile name | ''"
NoStore="true |
false"
SqlDependency="database/table name pair |
CommandNotification"
%>
CacheProfile
用于调用Web.config配置文件中设置的缓存时间。这是可选属性,默认值为空字符
("")。
例如:
在Web.config中加入配置:
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add
name="CacheTest" duration="50"
/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
页面中声明:
<%@
OutputCache CacheProfile="CacheTest" VaryByParam="none"
%>
注意:
包含在用户控件(.ascx 文件)中的 @ OutputCache
指令不支持此属性。在页中指定此属性时,属性值必须与 outputCacheSettings 节下面的 outputCacheProfiles
元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。
如果每个页面的缓存时间相同,则不需要每个页面设置,而是通过统一一个地方控制,这样就可以更好的统一控制所有页面的缓存时间。如果想改变缓存时间,只需要改一下web.config的配置信息即可,而不用每个页面去修改。
VaryByControl
通过用户控件文件中包含的服务器控件来改变缓存(值是控件ID,多控件用分号隔开)。
ASP.NET 页和用户控件上使用 @ OutputCache 指令时,需要该属性或 VaryByParam 属性。
<%@
Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs"
Inherits="CacheWebApp._16_4_3.WebForm2" %>
<%@ OutputCache
Duration="60" VaryByParam="none" VaryByControl="DropDownList1"
%>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head
runat="server">
<title>根据控件页面缓存</title>
</head>
<body>
<form
id="form1" runat="server">
<div>
<%=DateTime.Now %>
<br>
<asp:DropDownList ID="DropDownList1"
runat="server">
<asp:ListItem>beijing</asp:ListItem>
<asp:ListItem>shanghai</asp:ListItem>
<asp:ListItem>guangzhou</asp:ListItem>
</asp:DropDownList>
<asp:Button
ID="Button1" runat="server" Text="提交"
/>
</div>
</form>
</body>
</html>
以上代码设置缓存有效期是60秒,并且页面不随任何GET或POST参数改变(即使不使用VaryByParam属性,但是仍然需要在@
OutputControl指令中显式声明该属性)。如果用户控件中包含ID属性为“DropDownList1”的服务器控件(例如下拉框控件),那么缓存将根据该控件的变化来更新页面数据。

此外介绍一下页面页面输出缓存的API:程序人员可以通过调用API将Response内容存放到Web服务器的Cache中:

Response类的Cache属性用于获取页面缓存策略。该方式的核心是调用System.Web.HttpCachePolicy。该类主要包含用于设置缓存特定的HTTP标头的方法和用于控制ASP.NET页面输出缓存的方法。与.NET

Framework 1.x中的HttpCachePolicy类相比,.NET Framework
2.0中的HttpCachePolicy类得到了扩充和发展。主要是增加了一些重要方法,例如,SetOmitVarStar方法等。由于HttpCachePolicy类方法众多,下面简要说明几个常用方法。
SetExpires方法
用于设置缓存过期的绝对时间。它的参数是一个DataTime类的实例,表示过期的绝对时间。
protected
void Page_Load(object sender, EventArgs e)
{
//
通过API设置缓存
//相当于@OutputCache指令中的Duration属性
Response.Cache.SetExpires(DateTime.Now.AddSeconds(10));
Response.Cache.SetExpires(DateTime.Parse("6:00:00PM"));
}
如上代码,第一行代码表示输出缓存时间是60秒,并且页面不随任何GET或POST参数改变,等同于“<%@
OutputCache Duration="60" VaryByParam="none"
%>”。第二行代码设置缓存过期的绝对时间是当日下午6时整。
SetLastModified方法
用于设置页面的Last-Modified
HTTP标头。Last-Modified
HTTP标头表示页面上次修改时间,缓存将依靠它来进行计时。如果违反了缓存限制层次结构,此方法将失败。该方法的参数是一个DataTime类的实例。
SetSlidingExpiration方法
该方法将缓存过期从绝对时间设置为可调时间。其参数是一个布尔值。当参数为true时,Cache-Control
HTTP标头将随每个响应而更新。此过期模式与相对于当前时间将过期标头添加到所有输出集的IIS配置选项相同。当参数为False时,将保留该设置,且任何启用可调整过期的尝试都将静态失败。此方法不直接映射到HTTP标头。它由后续模块或辅助请求来设置源服务器缓存策略。
SetOmitVaryStar方法
ASP.NET
2.0新增的方法。用于指定在按参数进行区分时,响应是否应该包含vary:*标头。方法参数是一个布尔值,若要指示HttpCachePolicy不对其VaryByHeaders属性使用*值,则为true;否则为false。
SetCacheability方法
用于设置页面的Cache-Control
HTTP标头。该标头用于控制在网络上缓存文档的方式。该方法有两种重载方式,所不同的是参数。一种重载方法的参数是HttpCacheability枚举值,包括NoCache、Private、Public、Server、ServerAndNoCache和ServerAndPrivate(有关这些枚举值的定义,可参考MSDN)。另一种方法的参数有两个,一个参数是HttpCacheability枚举值,另一个参数是字符串,表示添加到标头的缓存控制扩展。需要注意的是,仅当与Private或NoCache指令一起使用时,字段扩展名才有效。如果组合不兼容的指令和扩展,则此方法将引发无效参数异常。

 

引用地址:

转载于:https://www.cnblogs.com/sishierfei/archive/2012/07/13/2590509.html

你可能感兴趣的文章
【PyQt5 学习记录】008:改变窗口样式之二
查看>>
android EditText长按屏蔽ActionMode context菜单但保留选择工具功能
查看>>
BUAA 111 圆有点挤
查看>>
c++ 继承产生的名字冲突问题 (1)
查看>>
SQL中on条件与where条件的区别
查看>>
Ubuntu下查看软件版本及安装位置
查看>>
安装IIS
查看>>
动态加载JS(转)
查看>>
SWUST OJ(961)
查看>>
js换空格为别的元素
查看>>
Recommendation Systems
查看>>
shell脚本 inotify + rsync 同步脚本
查看>>
maven pom 引入本地jar包
查看>>
QVT之The Relations Language(Part 二)
查看>>
python--dict和set类型--4
查看>>
快速实现Magento多语言的设置和产品数据的多语言方法
查看>>
python操作数据库
查看>>
Django的ORM基本操作补充一对多
查看>>
A - Oil Deposits(搜索)
查看>>
E - Phone List(字典序,string类型使用)
查看>>