一:我们为什么要使用缓存?
先来理解一下asp.net缓存技术的基本原理:把访问频繁的数据以及需要花大量的时间来加载的数据缓存在内存中,那么用户在下次请求同样的数据时,直接将内存中的数据返回给用户,从而大大的提高了应用程序的性能。
二:缓存的分类(整页缓存,页面部分缓存,应用程序缓存)
那么什么时候我们要用到整页缓存,什么时候用到部分页面缓存,什么时候我们要用到应用程序缓存呢?
>>整页缓存的情况:
a)不需要平凡更新数据的页面
b)占用大量时间和资源的页面
>>页面部分缓存:
顾名思义,页面部分缓存,则只需要缓存页面中的部分页面,常用方法是“缓存后替换”,就是下缓存整个页面,然后替换页面中不需要缓存的地方。这里要用到一个Substitution控件实现,稍后详细讲解它的应用。
>>应用程序缓存:
用来存储与应用程序相关的对象,主要由Cache类来实现,它给我们提供了一种机制,使我们可以通过编码的方式来灵活控制缓存操作。
三:如何使用"整页缓存"?
首先我们需要在页面顶部加上这样一个指令:
<%@ OutputCache Duation="5" VaryByParam="id,name" VaryByControl="none" Location="any" VaryByCustom="browser" %>
以下详细介绍一下各个属性的用途:
- Duration:必要属性,就是这个页面过多久后缓存不在起到作用,单位是s
- VaryByParam:以分号分隔的字符串变量/none/* ,none表示不随任何参数彼变化缓存,*表示为任何一个有效的参数缓存一个单独的页面。 注意:如果没有BaryByControl属性,该属性是必要的。
- VaryByControl:以分号分隔的字符串变量,代表用户控件中声明的服务器控件的ID,注意:如果没有VaryByParam,该属性是必须的。
- VaryByCustom:自定义输出缓存的要求,它需要在global.asax中定义自定义变动,一般默认值为browser,根据了浏览器决定缓存要求。
- Location:指定输出缓存项的位置,OutputCacheLocation枚举,默认值为any。
例如:现在我们有一个图书详情页面,这里就拿当当网的图书详情页面来举例,当当网当你选择一本书后,进入到图书详情页,详情页肯定会包含:该图书的点击量,价格,目录信息,作者,出版社等等的一些介绍。
那么我们要缓存这个页面首现需要在页面顶部添加这样一个指令:
1)首现无条件缓存:<%@ OutputCache Duration="120" VaryByParam="none" %>
这个表示什么意思呢?就是这个页面缓存时间为120秒,假如你进到这个详情页,然后卖家在后台修改了图书的出版社,那么你现在无论怎么刷新,你看到的价格始终都是刚进页面时的出版社信息。必须等到120s后,点击刷新才可以看到卖家修改后的出版社信息。
2)根据条件缓存:<%@ OutputCache Duration="120" VaryByParam="bookId,bookName" %>
这个就是说以bookId或者bookName作为参数传递的页面都将被缓存120s,例如:http://web/BookDetails.aspx?bookId ,页面会被缓存120s。
3)根据VaryByControl属性:<%@ OutputCache Duration="120" VaryByParam="none" VaryByControl="ddlCategories" %>
当需要缓存的数据随页面上的某个控件值的改变而改变,根据asp.net控件的命名规则,大家都知道ddlCategories控件就是一个图书的分类控件了(DropDawnList)。
现在假如有一个图书分类的页面,那么假如卖家修改了某个分类下的某一本图书的信息,当用户在页面中查看到的还是修改之前的信息,只有在更换ddCategories控件的项后,在更新才会显示修改后的图书信息。
四:如何使用"页面部分缓存"?
<%@ OutputCache Duration="120" VaryByParam="none" %>
什么情况我们要使用到部分页面缓存呢,还是拿图书详情页来举例子:现在要统计图书时实的点击量。
首先放入一个:<asp:Substitution ID="Sub1" runat="server" MethodName="GetClickCount" /> 控件。
这个控件就是用来显示点击量的,我们可以看到MethodName属性调用了一个GetClickCount()方法。
static string GetClickCount(HttpContext contxt)
{
//根据图书ID查询本图书的点击量
int clickCount = manage.GetClick(bookId);
return clickCount.ToString();
}
假如现在点击量是1000次,那么你刷新后,点击量可能变成了1000+次了,因为此时此刻该图书可能还有其他的用户在点击访问。由此证明该图书的点击量并没有被缓存起来。
这里需要注意的是:Substitution控件的MethodName属性所调用的方法必须满足以下三个条件。
1)必须是静态static方法
2)返回值必须是String类型
3)参数类型必须是HttpContext类型
五:如何实现"应用程序缓存"?
前面说到,应用程序缓存是用来存储与应用程序相关的对象,主要由Cache类来实现。
第一步当然要添加using System.Web.Caching的命名空间。
1)添加缓存:
- Cache[bookInfo"] = bookInfo;//这里就是缓存一个图书信息的对象。
那么现在假如说我们要设置缓存的有效期,就必须用到Cache的静态方法Add(),里设置缓存了。
- Cache.Add("key","缓存测试",null,DeteTime.Now.AddSeconds(6),TimeSpan.Zero,CacheItemPriority.High,null);
可以看到使用Add方法,七个参数必须写完整才生效,所以灵活性不够好。
- 使用Insert方法来实现多钟方式的方法重载。
- Cache.Insert("key1","使用insert缓存");//只需要键和值两个参数就可以添加缓存。
- Cache.Insert("key2","测试依赖性的缓存",new System.Web.Caching.CacheDependency(null,dependencies));//添加依赖项的缓存
- Cache.Insert("key3","设置有效期的缓存",DateTime.Now.AddMinutes(1d),System.Web.Caching.Cache.NoslidingExpiration);//设置有效期
- Cache.Insert("key4","测试添加优先级缓存",null,Cache.NoAbsoluteExpiration,Cache.NoAbsoluteExpiration,CacheItemPriorit.High,null);//添加优先级的缓存
2)检索缓存
由于缓存容易丢失,所以我们从缓存中取数据之前先要判断改缓存项是否存在。
通常这样检测:Cache["key"] 是否为 null。
3)移除应用程序的缓存对象
- 自动移除:缓存超过有效期,依赖性更改,缓存项就会自动移除。
- 显式移除:Cache.Remove("key") ; //键名
下面来举一个列子,说明应用程序缓存对象的用法。
private void CacheBookInfo(int bookId){ Book book = null;
//如果缓存为空,则说明是第一次加载,这时就缓存图书信息
if(Cache[bookId.ToString()]==null){
book = bookManager.GetBookById(bookId);
}else{
book = (Book) Cache[bookId.ToString()];
}
//假如该书有很高的访问量,则可以对该图书进行缓存
if(book.Clicks>20000){
Cache[bookId.ToString()] = book;
}
//下面就可以将book中的信息显示到页面了
lblBookName.Text = book.BookName;
//...
}
那么现在,我们为什么要使用缓存?缓存有哪几种方式?分别是怎样实现的?如果这三个问题弄明白了,就说明你对Asp.Net的缓存机制已经有了足够了解了。