ASP.NET缓存总结

简介:

一:ASP.NET中缓存分类,共3种
页面输出缓存、页面片段缓存、页面数据缓存
二:页面输出缓存
可以使用页面输出缓存来提高WEB站点的性能。可以缓存页面的输出并且把缓存起来的拷贝发送出去以响应浏览器的请求,而不是每次在请求页面时执行页面。
例:你的站点包括一个从数据库表检索出来的显示产品信息的页面。默认情况下,每次用户访问产品页面时,都必须执行该页面并且从数据库检索数据。但如果启用页面输出缓存,这个页面就只执行一次,并且只从数据库检索一次数据。这就意味着减轻了WEB应用程序和数据库服务器的负载。
要启用页面输出缓存,在页面中包括如下页面处理指令即可:
<%@ OutputCache Duration="60" VaryByParam="none" %>
如下例:
<%@ Page Language="C#" %>
<%@ OutputCache Duration="300" VaryByParam="none" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script language="C#" runat="server">
void Page_Load(Object sender , EventArgs e)
{
SqlConnection conNorthwind;
string strSelect;
SqlCommand cmdSelect;
SqlDataReader dtrProducts;
conNorthwind = new SqlConnection( @"Server=localhost;Integrated Security=SSPI;Database=Northwind" );
strSelect = "Select * From Products Where ProductID=1";
cmdSelect = new SqlCommand( strSelect, conNorthwind );
conNorthwind.Open();
dgrdProducts.DataSource = cmdSelect.ExecuteReader( CommandBehavior.SingleRow );
dgrdProducts.DataBind();
conNorthwind.Close();
string strTime = DateTime.Now.ToString();
lblMessage.Text = strTime;
}
</script>
<html>
<head><title>ProductPage.aspx</title></head>
<body>
<asp:DataGrid
ID="dgrdProducts"
CellPadding="10"
Runat="Server" />
<hr>
<small>Last Updated: <asp:Label
ID="lblMessage"
Font-Bold="True"
ForeColor="Blue"
Runat="Server" /></small>
</body>
</html>
此例中显示了从Northwind数据库检索到的特定产品信息,这个页面被缓存5分钟。
注:不能保证缓存的项总会保留在页面的输出缓存中。如果系统资源不足,ASP.NET框架会开始从缓存中清理缓存项。
属性Duration表示缓存的时间,以秒为单位。
属性VaryByParam表示对一个页面请求中包含参数(查询字符串参数或表单域参数)时页面该如何被缓存。这个属性可以接受分号作为分隔符的参数列表,或者是如下两个特殊值:
none------表示即使页面被请求时带不同的参数,也不会创建页面不同的缓存版本。
*-----------表示在页面被请求时带有不同的参数,则创建页面不同的缓存本。
如:http://locathost/p.aspx?pid=4
http://localhost/p.aspx?pid=5
<%@ OutputCache Duration="300" VaryByParam="pid" %>
这条指令根据查询字符串参数pid的值来缓存页面的不同版本。如果以pid为4来请求这个页面,然后又以pid为5来请求这个页面,那么就保存了该页面的不同缓存版本。
设置缓存的位置---属性Location(取来自OutputCacheLocation枚举类型的一个值):
Any---默认值。页面可在任何地方缓存,包括服务器、下游服务器、浏览器。
Client---页面的输出只在浏览器缓存。
DownStream----页面的输出只在下游服务器上缓存。
None----不执行页面缓存操作。
Server----页面只在服务器端缓存。
使用HttpCachePolicy类--精确控制页面的缓存行为
其中SetExpires()方法表示页面过期的日期,SetCacheability()方法表示页面要如何来缓存。SetCachability()方法取HttpCacheability枚举类型中的值:
NoCache---防止任何页面用Cache-Control:no-cache头来缓存。
Private--表示页面不应当被代理服务器来缓存,但可以被浏览器缓存。默认值。
Public--表示页面可以被浏览器和代理服务器缓存。
Server--表示页面只可以在服务器端被缓存。
三:使用页面片段缓存
页面片段缓存是通过用户服务控件来实现的。通过为页面的每个区域创建一个单独的用户控件,就可以定义页面的不同区域。在每个用户控件中,可以使用OutputCache指令来表示如何缓存控件的输出。
注意:
在默认情况下,每个用户控件的输出都被单独缓存起来,如果要跨多个用户控件共享同样的输出缓存,以节省内在开销,那么可以使用Shared属性
<%@ OutputCache Duration="60" VaryByParam="*" Shared="true" %>
页面片段缓存的限制:
由于控件被缓存了,就不能在页面中编程设置用户控件的属性;也不能对被缓存的用户控件使用数据绑定的语法。
四:使用页面数据缓存
每个ASP.NET应用程序都有一个Cache对象,直到应用程序重新启动之前该对象一直可用。
Cache.Insert("t1", "goodtyl");//新增项
Cache.Insert("t2", "weiwei");
Cache.Insert("t3", "haha");
Cache.Remove("t3");//移除项
//遍历Cache,注意System.Collections.DictionaryEntry:定义可设置或可检索的字典键/值对
foreach(DictionaryEntry temp in Cache)
{
Response.Write("key: " + temp.Key.ToString() + "value: " + temp.Value.ToString() + "<br>");
}
添加缓存文件依赖:在添加一个文件依赖时,可以把该项与一个文件相关联。如果文件发生改变,就自动从缓存中删除该项。如例:Cache.Insert("mi","hello",new System.Web.Caching.CacheDependency(MapPath("a.txt")));如果a.txt被修改了,那么,mi就自动从缓存中删除。
添加缓存触发依赖:只要数据库表的记录发生改变就更新缓存中的一项。
需要使用sqlserver触发器及xp_cmdshell扩展存储过程。
CREATE TRIGGER UpdateCache
ON Products
FOR UPDATE, DELETE, INSERT
AS
DECLARE @cmd Varchar( 200 )
SELECT @cmd = 'echo ' + Cast( getDATE() As Varchar( 50 ) ) +
' > c:\tableChange.txt'
EXEC master..xp_cmdshell @cmd, no_output
代码:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script language="C#" runat="server">
void Page_Load(Object sender , EventArgs e)
{
DataSet dstProducts = (DataSet)(Cache[ "productsDS" ]);
if ( dstProducts == null )
{
dstProducts = GetProducts();
Cache.Insert( "Products", dstProducts, new CacheDependency( "c:\\tableChange.txt" ) );
}
dgrdProducts.DataSource = dstProducts;
dgrdProducts.DataBind();
}
DataSet GetProducts() {
SqlConnection conNorthwind;
string strSelect;
SqlDataAdapter dadProducts;
DataSet dstProducts;
conNorthwind = new SqlConnection( @"Server=localhost;Integrated Security=SSPI;Database=Northwind" );
strSelect = "Select TOP 20 * From Products ORDER BY ProductID";
dadProducts = new SqlDataAdapter( strSelect, conNorthwind );
dstProducts = new DataSet();
dadProducts.Fill( dstProducts, "ProductsDS" );
return dstProducts;
}
</script>
<html>
<head><title>DatabaseDependency.aspx</title>
</head>
<body>
<asp:DataGrid
ID="dgrdProducts"
Runat="Server" />
</body>
</html>
添加缓存键依赖:
<%@ Page Language="C#" %>
<script language="C#" runat="server">
void UpdateItem1( object s, EventArgs e )
{
Cache[ "item1" ] = txtNewValue.Text;
}
void UpdateItem2( object s, EventArgs e )
{
string arrKeyDepends = ( "item1" );
Cache.Insert( "item2", txtNewValue.Text, new CacheDependency( Server.MapPath(arrKeyDepends), System.DateTime.Now ) );
}
</script>
<html>
<head><title>KeyDependency.aspx</title></head>
<body>
<form Runat="Server">
<asp:TextBox
ID="txtNewValue"
Runat="Server" />
<p>
<asp:Button
Text="Update Item1"
OnClick="UpdateItem1"
Runat="Server" />
<asp:Button
Text="Update Item2"
OnClick="UpdateItem2"
Runat="Server" />
<hr>
Item1 = <%=Cache[ "item1" ]%>
<br>
Item2 = <%=Cache[ "item2" ]%>
</form>
</body>
</html>
创建一个绝对过期策略:
Cache.Insert("Time", strTime, null, DateTime.Now.AddMinutes( 1 ), Cache.NoSlidingExpiration );
创建相对过期策略:
Cache.Insert("Time", strTime, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes( 1 ) );
设置缓存项的优先级:
Cache.Insert("my","hello",null,Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration,CacheItemPriority.High,null);
创建缓存回调方法:在插入一个项到缓存时,可以把一个回调方法与这个项关联起来。无论是何种原因,只要该项从缓存中删除,那么回调方法就自动执行。
最明显的回调应用是当一个项过期时自动把该项重新加载到缓存中。
示例代码:
<%@ Page Language="C#" %>
<script language="C#" runat="server">
public static CacheItemRemovedCallback onRemove;
//CacheItemRemovedReason表示从缓存中删除项的原因
void ItemRemoved( string strItemKey, object objItemValue, CacheItemRemovedReason objRemovedReason )
{
string strLogEntry;
strLogEntry = "Item with value " + objItemValue.ToString() ;
strLogEntry = " removed at " + System.DateTime.Now.ToString( "T" );
strLogEntry = " because of " + objRemovedReason.ToString();
if ( Application[ "CacheLog" ] == null )
{
Application[ "CacheLog" ] = new ArrayList();
}
//Application[ "CacheLog" ].Add( "strLogEntry" );
//Beep();
}
void btnAddCache_Click( object s, EventArgs e )
{
onRemove = new CacheItemRemovedCallback( ItemRemoved );
Cache.Insert( "myItem", txtNewValue.Text, null, DateTime.Now.AddSeconds( 10 ), Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove );
}
void btnRemoveCache_Click( object s, EventArgs e )
{
Cache.Remove( "myItem" );
}
void Page_PreRender( object s, EventArgs e )
{
dgrdCacheLog.DataSource = Application[ "CacheLog" ];
dgrdCacheLog.DataBind();
}

</script>
<html>
<head><title>CacheCallback.aspx</title></head>
<body>
<form Runat="Server">
<h2>Cache Log</h2>
<asp:DataGrid
ID="dgrdCacheLog"
CellPadding="8"
Runat="Server" />
<p>
<asp:TextBox
id="txtNewValue"
Runat="Server" />
<p>
<asp:Button
id="btnAddCache"
Text="Add To Cache!"
OnClick="btnAddCache_Click"
Runat="Server" />
<asp:Button
id="btnRemoveCache"
Text="Remove From Cache!"
OnClick="btnRemoveCache_Click"
Runat="Server" />
<asp:Button
Text="Refresh Page!"
Runat="Server" />
</form>
</body>
</html>
from:
http://hi.baidu.com/cucugo/blog/item/6615798b23630e1ac8fc7ae4.html




本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/articles/1524541.html,如需转载请自行联系原作者

相关文章
|
6月前
|
缓存 开发框架 .NET
ASP.NET Core 缓存
Get新知识: 缓存相关概念:缓存的类型:总结:总的来说,私有缓存会减少网络带宽的需求,同时会减少从缓存到API的请求。因为私有缓存是存储在客户端浏览器的,对于请求来说,如果缓存还在有限期内,那么请求连网络请求都不会发出会直接在客户端浏览器获取到响应,这样就减少网络请求次数,同样也会减少API请求次数。而共享缓存不会节省缓存到API的网路带宽,但是它会减少请求到API的请求。因为共享缓存是...
32 0
ASP.NET Core 缓存
|
9月前
|
存储 SQL 缓存
ASP.NET Core MVC 从入门到精通之缓存
ASP.NET Core MVC 从入门到精通之缓存
86 0
|
存储 缓存 开发框架
Asp.Net Core 2.1+的视图缓存(响应缓存)
Asp.Net Core 2.1+的视图缓存(响应缓存)
68 0
|
存储 消息中间件 缓存
Redis入门与ASP.NET Core缓存
Redis入门与ASP.NET Core缓存
343 0
Redis入门与ASP.NET Core缓存
|
缓存 前端开发 JavaScript
|
存储 缓存 .NET
|
缓存 .NET 数据建模
|
Web App开发 缓存 监控
ASP.NET性能优化之反向代理缓存
到目前为止,我们讨论了把缓存存放在ASP.NET的输出缓存中(内存和硬盘),以及浏览器缓存中,而大型站点的另一种常用做法是将缓存部署在反向代理服务器上,这类缓存我们通常称之为反向代理缓存,比如Squid和Varnish。
955 0
|
Web App开发 缓存 JavaScript
ASP.NET性能优化之局部缓存
在网站的开发过程中,经常碰到的一类需求场景是: 1:页面含热点新闻,热点新闻部分需要10分钟更新一次,而整个页面的其它部分1天内都不会变动; 2:首页的某个BANNER需要显式:欢迎***; 上面场景中的1,如果整个页面的缓存失效都定为10分钟,则势必增加性能开销,所以最好的策略是页面的不同部分采用不同的缓存失效时长。
1334 0