asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET缓存介绍


发布日期:2019年02月16日
 
ASP.NET缓存介绍

ASPNET缓存

介绍

缓存是在内存存储数据的一项技术也是ASPNET中提供的重要特性之一例如你可以在复杂查询的时候缓存数据这样后来的请求就不需要从数据库中取数据而是直接从缓存中获取通过使用缓存可以提高应用程序的性能

主要有两种类型的缓存

输出缓存Output caching

数据缓存Data caching

输出缓存(Output Caching)

使用输出缓存你可以缓存最后输出的HTML页面当相同的页面再次请求的时候ASPNET不会再执行页面的生命周期和相关代码而是直接使用缓存的页面语法如下

复制代码代码如下:
<%@ OutputCache Duration=”” VaryByParam=”None” %>
Duration 属性设置页面将被缓存任何的用户请求都会被缓存在缓沖的秒内相同的请求都会直接使用缓存的页面当缓存过期后ASPNET会再次执行页面代码并且为下一个秒创建一个新的HTML缓存
复制代码代码如下:
<%@ Page Language="C#" MasterPageFile="~/MasterPagemaster" AutoEventWireup="true" CodeFile="OutputCachingTestaspxcs" 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)
{
lblDateText = DateTimeNowToShortDateString();
lblTimeText = DateTimeNowToLongTimeString();
}

在这个例子中页面将被缓存

通过查询字符串缓存(Cache by Query String )

在实际应用中页面往往会根据一些参数动态的改变页面的内容如果你的页面是通过查询字符串来获取信息的你可以根据查询字符串很容易的缓存页面的不同拷贝VarByParam=”None”指定ASPNET只存储缓存页面的一个拷贝VarByParam=”*” 指定ASPNET根据不同的查询字符串存储不同的缓存页面
复制代码代码如下:
<%@ OutputCache Duration="" VaryByParam="*" %>
<div align="right">
<a href="OutputCachingTestaspx">No Query String</a> |
<a href="OutputCachingTestaspx?id=">ID </a> |
<a href="OutputCachingTestaspx?id=">ID </a> |
<a href="OutputCachingTestaspx?id=">ID </a> |
<a href="OutputCachingTestaspx?id=&langid=">ID </a>
</div>
上面的例子中在查询字符串中传了不同的IDASPNET为每一个ID都存储了单独的缓存页面这种方式会有一些问题就是当查询字符串范围很广的时候
这个时候我们可以在VarByParam 属性中指定重要的查询字符串变量的名字如下
复制代码代码如下:
%@OutputCacheDuration=""VaryByParam="id;langid"%
自定义缓存(Custom Caching)
你也可以创建自定义的程序来缓存页面ASPNET提供了一种很便捷的方式来创建自定义缓存使用VarByCustom属性指定自定义缓存类型的名字
你还要创建为缓存生成自定义字符串的方法如下
复制代码代码如下:
public override stringGetVaryByCustomString(HttpContext context stringcustom)
{
if(custom == "browser")
{
returncontextRequestBrowserBrowser +
contextRequestBrowserMajorVersion;
}
else
{
return baseGetVaryByCustomString(context custom);
}
}

这个方法必须写在globalasax文件中ASPNET使用该方法返回的字符串来实现缓存如果这个方法在不同的请求中返回相同的字符串ASPNET就会使用缓存的页面否则就会生成新的缓存版本
上面的例子中GetVaryByCustomString()方法根据浏览器的名字创建缓存字符串ASPNET会根据不同的浏览器请求创建不同版本的缓存
控件缓存(Control Cache )
上面的缓存技术可以让你很容易的缓存整个页面如果要缓存指定控件的内容可以通过指定VaryByControl 属性来完成
复制代码代码如下:
%@OutputCacheDuration=""VaryByControl="MyControl_"%
上面代码ASPNET将会缓存MyControl_控件分钟如果要根据一些属性值来缓存控件只需要将OutPutCache指令加入*ascx页面
复制代码代码如下:
<%@Control Language="C#"AutoEventWireup="true"CodeFile="MyControlascxcs"
Inherits="Controls_MyControl"%>
<%@OutputCacheDuration=""VaryByControl="EmployeeID"%>
VaryByControl=”EmployeeID”告诉ASPNET根据控件中声明的EmployeeID属性来创建不同版本的缓存
ascxcs 文件加入EmplyeeID属性为ASPNET 缓存使用
在页面中增加控件并且设置 EmployeeID
复制代码代码如下:
private int_employeeID;
public intEmployeeID
{
get{ return_employeeID; }
set{ _employeeID = value; }
}
protected voidPage_Load(objectsender EventArgs e)
{
lblDateText = DateTimeNowToShortDateString();
lblTimeText = DateTimeNowToLongTimeString();
lblEmployeeIDText = EmployeeIDToString();
}
缓存配置文件(Cache Profile )
webconfig可以配置缓存相关的设置
复制代码代码如下:
<systemweb>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<addname="ProductItemCacheProfile" duration=""/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</systemweb>
你可以通过设置 CacheProfile=”ProfileName” 属性 来使用上面的配置
复制代码代码如下:
%@OutputCacheCacheProfile="ProductItemCacheProfile"VaryByParam="None"%
数据缓存(Data Caching)
ASPNET还提供了另一种灵活的缓存类型数据缓存你可以将一些耗费时间的条目加入到一个对象缓存集合中以键值的方式存储
复制代码代码如下:
Cache["Name"] = data;

我们可以通过使用CacheInsert()方法来设置缓存的过期优先级依赖项等
复制代码代码如下:
date = DateTimeNow;CacheInsert("Date" date null DateTimeNowAddSeconds() TimeSpanZero);

ASPNET允许你设置一个绝对过期时间或滑动过期时间但不能同时使用
缓存依赖项Cache dependency
缓存依赖项使缓存依赖于其他资源当依赖项更改时缓存条目项将自动从缓存中移除缓存依赖项可以是应用程序的 Cache 中的文件目录或与其他对象的键如果文件或目录更改缓存就会过期
复制代码代码如下:
date = DateTimeNow;
string[] cacheKeys = { "Date"};
CacheDependency cacheDepn = newCacheDependency(null cacheKeys);
CacheInsert("Date" date cacheDepn);

上面的例子“Date”缓存对象依赖“Date”缓存条目当 “Date” 对象过期后“Date” 将会自动过期CacheDependency(null cacheKeys)中的第一个参数为空是由于我们只监视缓存键的更改情况
回调函数和缓存优先级(Callback Method and Cache Priority)
ASPNET允许我们写一个回调函数当缓存条目从缓存中移除的时候触发还可以设置缓存条目的优先级
复制代码代码如下:
protected void Page_Load(object sender EventArgs e)
{
DateTime? date = (DateTime?)Cache["Date"];
if (!dateHasValue) // date == null
{
date = DateTimeNow;
CacheInsert("Date" date null DateTimeNowAddSeconds() TimeSpanZero
CacheItemPriorityDefault new CacheItemRemovedCallback(CachedItemRemoveCallBack));
}
DateTime? date = (DateTime?)Cache["Date"];
if (!dateHasValue) // date == null
{
date = DateTimeNow;
CacheInsert("Date" date null DateTimeNowAddSeconds() TimeSpanZero
CacheItemPriorityDefault new CacheItemRemovedCallback(CachedItemRemoveCallBack));
}
// Set values in labels
lblDateText = dateValueToShortDateString();
lblTimeText = dateValueToLongTimeString();
lblDateText = dateValueToShortDateString();
lblTimeText = dateValueToLongTimeString();
}
private void CachedItemRemoveCallBack(string key object value CacheItemRemovedReason reason)
{
if (key == "Date" || key == "Date")
{
CacheRemove("Date");
CacheRemove("Date");
}
}

例子中创建了“Date” 和 “Date”缓存“Date” 在秒后过期“Date”为但是由于我们注册了移除的回调函数当“Date” 或 “Date”其中一个过期都会执行CachedItemRemoveCallBack 方法在这个方法中移除了两个缓存条目ASPNET还提供了处理缓存条目更新时的回调函数CacheItemUpdateCallback
原文

               

上一篇:asp.net2.0加密数据库连接字符串技巧

下一篇:ASP.NET Datagridview自动换行的小例子