ASPNET缓存
介绍
缓存是在内存存储数据的一项技术也是ASPNET中提供的重要特性之一例如你可以在复杂查询的时候缓存数据这样后来的请求就不需要从数据库中取数据而是直接从缓存中获取通过使用缓存可以提高应用程序的性能
主要有两种类型的缓存
输出缓存Output caching
数据缓存Data caching
输出缓存(Output Caching)
使用输出缓存你可以缓存最后输出的HTML页面当相同的页面再次请求的时候ASPNET不会再执行页面的生命周期和相关代码而是直接使用缓存的页面语法如下
复制代码代码如下:
<%@ OutputCache Duration=”
” VaryByParam=”None” %>
Duration 属性设置页面将被缓存
妙
任何的用户请求都会被缓存
在缓沖的
秒内相同的请求都会直接使用缓存的页面
当缓存过期后ASP
NET会再次执行页面代码并且为下一个
秒创建一个新的HTML缓存
复制代码代码如下:
<%@ Page Language="C#" MasterPageFile="~/MasterPage
master" AutoEventWireup="true" CodeFile="OutputCachingTest
aspx
cs" Inherits="OutputCachingTest" Title="Page" %>
<%@ OutputCache Duration="
" VaryByParam="None" %>
<asp:Content ID="Content
" ContentPlaceHolderID="ContentPlaceHolder
" runat="Server">
<div class="title">Output Cache</div>
Date: <asp:Label ID="lblDate" runat="server" Text="" />
Time: <asp:Label ID="lblTime" runat="server" Text="" />
</asp:Content>
protected void Page_Load(object sender
EventArgs e)
{
lblDate
Text = DateTime
Now
ToShortDateString();
lblTime
Text = DateTime
Now
ToLongTimeString();
}
在这个例子中页面将被缓存
秒
通过查询字符串缓存(Cache by Query String )
在实际应用中页面往往会根据一些参数动态的改变页面的内容
如果你的页面是通过查询字符串来获取信息的
你可以根据查询字符串很容易的缓存页面的不同拷贝
VarByParam=”None”指定ASP
NET只存储缓存页面的一个拷贝
VarByParam=”*” 指定ASP
NET根据不同的查询字符串存储不同的缓存页面
复制代码代码如下:
<%@ OutputCache Duration="
" VaryByParam="*" %>
<div align="right">
<a href="OutputCachingTest
aspx">No Query String</a> |
<a href="OutputCachingTest
aspx?id=
">ID
</a> |
<a href="OutputCachingTest
aspx?id=
">ID
</a> |
<a href="OutputCachingTest
aspx?id=
">ID
</a> |
<a href="OutputCachingTest
aspx?id=
&langid=
">ID
</a>
</div>
上面的例子中
在查询字符串中传了不同的ID
ASP
NET为每一个ID都存储了单独的缓存页面
这种方式会有一些问题就是当查询字符串范围很广的时候
这个时候我们可以在VarByParam 属性中指定重要的查询字符串变量的名字
如下
复制代码代码如下:
%@OutputCacheDuration="
"VaryByParam="id;langid"%
自定义缓存(Custom Caching)
你也可以创建自定义的程序来缓存页面
ASP
NET提供了一种很便捷的方式来创建自定义缓存
使用VarByCustom属性指定自定义缓存类型的名字
你还要创建为缓存生成自定义字符串的方法
如下
复制代码代码如下:
public override stringGetVaryByCustomString(HttpContext context
stringcustom)
{
if(custom == "browser")
{
returncontext
Request
Browser
Browser +
context
Request
Browser
MajorVersion;
}
else
{
return base
GetVaryByCustomString(context
custom);
}
}
这个方法必须写在global
asax文件中
ASP
NET使用该方法返回的字符串来实现缓存
如果这个方法在不同的请求中返回相同的字符串
ASP
NET就会使用缓存的页面
否则就会生成新的缓存版本
上面的例子中GetVaryByCustomString()方法根据浏览器的名字创建缓存字符串
ASP
NET会根据不同的浏览器请求创建不同版本的缓存
控件缓存(Control Cache )
上面的缓存技术可以让你很容易的缓存整个页面
如果要缓存指定控件的内容
可以通过指定VaryByControl 属性来完成
复制代码代码如下:
%@OutputCacheDuration="
"VaryByControl="MyControl_
"%
上面代码ASP
NET将会缓存MyControl_
控件
分钟
如果要根据一些属性值来缓存控件只需要将OutPutCache指令加入*
ascx页面
复制代码代码如下:
<%@Control Language="C#"AutoEventWireup="true"CodeFile="MyControl
ascx
cs"
Inherits="Controls_MyControl"%>
<%@OutputCacheDuration="
"VaryByControl="EmployeeID"%>
VaryByControl=”EmployeeID”告诉ASP
NET根据控件中声明的EmployeeID属性来创建不同版本的缓存
在
ascx
cs 文件加入EmplyeeID属性为ASP
NET 缓存使用
在页面中增加控件并且设置 EmployeeID
复制代码代码如下:
private int_employeeID;
public intEmployeeID
{
get{ return_employeeID; }
set{ _employeeID = value; }
}
protected voidPage_Load(objectsender
EventArgs e)
{
lblDate
Text = DateTime
Now
ToShortDateString();
lblTime
Text = DateTime
Now
ToLongTimeString();
lblEmployeeID
Text = EmployeeID
ToString();
}
缓存配置文件(Cache Profile )
web
config可以配置缓存相关的设置
复制代码代码如下:
<system
web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<addname="ProductItemCacheProfile" duration="
"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system
web>
你可以通过设置 CacheProfile=”ProfileName” 属性 来使用上面的配置
复制代码代码如下:
%@OutputCacheCacheProfile="ProductItemCacheProfile"VaryByParam="None"%
数据缓存(Data Caching)
ASP
NET还提供了另一种灵活的缓存类型
数据缓存
你可以将一些耗费时间的条目加入到一个对象缓存集合中
以键值的方式存储
复制代码代码如下:
Cache["Name"] = data;
我们可以通过使用Cache
Insert()方法来设置缓存的过期
优先级
依赖项等
复制代码代码如下:
date
= DateTime
Now;Cache
Insert("Date
"
date
null
DateTime
Now
AddSeconds(
)
TimeSpan
Zero);
ASP
NET允许你设置一个绝对过期时间或滑动过期时间
但不能同时使用
缓存依赖项Cache dependency
缓存依赖项使缓存依赖于其他资源
当依赖项更改时
缓存条目项将自动从缓存中移除
缓存依赖项可以是应用程序的 Cache 中的文件
目录或与其他对象的键
如果文件或目录更改
缓存就会过期
复制代码代码如下:
date
= DateTime
Now;
string[] cacheKeys = { "Date
"};
CacheDependency cacheDepn = newCacheDependency(null
cacheKeys);
Cache
Insert("Date
"
date
cacheDepn);
上面的例子“Date
”缓存对象依赖“Date
”缓存条目
当 “Date
” 对象过期后“Date
” 将会自动过期
CacheDependency(null
cacheKeys)中的第一个参数为空是由于我们只监视缓存键的更改情况
回调函数和缓存优先级(Callback Method and Cache Priority)
ASP
NET允许我们写一个回调函数
当缓存条目从缓存中移除的时候触发
还可以设置缓存条目的优先级
复制代码代码如下:
protected void Page_Load(object sender
EventArgs e)
{
DateTime? date
= (DateTime?)Cache["Date
"];
if (!date
HasValue) // date
== null
{
date
= DateTime
Now;
Cache
Insert("Date
"
date
null
DateTime
Now
AddSeconds(
)
TimeSpan
Zero
CacheItemPriority
Default
new CacheItemRemovedCallback(CachedItemRemoveCallBack));
}
DateTime? date
= (DateTime?)Cache["Date
"];
if (!date
HasValue) // date
== null
{
date
= DateTime
Now;
Cache
Insert("Date
"
date
null
DateTime
Now
AddSeconds(
)
TimeSpan
Zero
CacheItemPriority
Default
new CacheItemRemovedCallback(CachedItemRemoveCallBack));
}
// Set values in labels
lblDate
Text = date
Value
ToShortDateString();
lblTime
Text = date
Value
ToLongTimeString();
lblDate
Text = date
Value
ToShortDateString();
lblTime
Text = date
Value
ToLongTimeString();
}
private void CachedItemRemoveCallBack(string key
object value
CacheItemRemovedReason reason)
{
if (key == "Date
" || key == "Date
")
{
Cache
Remove("Date
");
Cache
Remove("Date
");
}
}
例子中创建了“Date
” 和 “Date
”缓存
“Date
” 在
秒后过期“Date
”为
秒
但是由于我们注册了移除的回调函数
当“Date
” 或 “Date
”其中一个过期都会执行CachedItemRemoveCallBack 方法
在这个方法中移除了两个缓存条目
ASP
NET还提供了处理缓存条目更新时的回调函数CacheItemUpdateCallback
原文