以前对缓存的认识比较零碎最近做的行业新闻项目可能会大量应用的缓存技术故将缓存技术再重新整理了下使我自己对缓存又有了一个全新的认识同时也给大家分享下
页输出缓存
全部输出缓存
页输出缓存在内存中存储处理后的 ASPNET 页的内容这一机制允许 ASPNET 向客户端发送页响应而不必再次经过页处理生命周期页输出缓存对于那些不经常更改但需要大量处理才能创建的页特别有用
要实现页输出缓存也很简单如你要对defaultaspx页面实施页面缓存那么你只需在defualtaspx页面中添加使用OutputCache指令OutputCache有多个属性其中两个必须的属性是Duration和VaryByParamDuration设置了缓存的过期时间单位为秒VaryByParam允许我们缓存页面的不同版本一般情况下VaryByParam设置为none具体示例如下
<%@ OutputCache Duration= VaryByParam=none %>
这个设置就是说明缓存时间是秒并且不分版本其实加上了这句就已经完成了页输出缓存设置了为了看下效果我在defaultaspxcs文件Page_Load方法中添加了ResponseWrite(DateTimeNowToString(yyyyMMdd HH:mm:ss))一句浏览页面后不断刷新发现时间并不会改变当缓存过期时间(秒)到点了刷新才会引起页面的变化
上面已经实现了的页输出缓存但是有一个问题现在是一个网页设置缓存可以放在defaultaspx中但是如果一个网站有成千上万个网页并且每个页面都需要设置缓存机制一旦缓存时间需要修改时就会涉及到要修改千万个网页这样做肯定是很麻烦的事情所以需要将网页的缓存设置放在一个公共地方一旦需要修改的时候调整起来比较方便刚好的nfig文件中可以设置页面缓存如下
<systemweb>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name=pageCache duration= varyByParam=none enabled =true/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</systemweb>
上面的意思为过期时间为秒不根据页面参数缓存
页面中调用此设置如下
<%@ OutputCache CacheProfile=pageCache %>
这样就完成了页输出缓存才配置
片段缓存
有些网页可能大部分都不需要经常变更比如页面头部和页脚但是正文部分可能经常变动像这些部分不经常变动而部分又经常变动的网页可以采取片段缓存的办法即将不怎么变动的部分做成一个单独的用户控件(ascx)调用的时间将这个ascx单独设置缓存就能达到一个网页中经常变动不缓存而不经常变动的部分缓存的效果了
缓存后替换
这种方式与片段缓存恰好相反是将整个页面先缓存然后将经常变动的地方单独做成一个ascx并且这个ascx不设置缓存如登录慧远保银首页给每个人显得的内容都是一样的唯独不一样的就是在某个地方显示了当前的用户名不一样这种情况就可以采取缓存后替换的办法先将整个网页缓存当然缓存下来的用户名可能是上个用户的但是采取缓存后替换的方法将你自己的用户名替换上个用户名就能得到很好的效果了
应用程序缓存
第一部分说到的都是关于网页的缓存缓存还提供另外一种缓存方式即应用程序缓存比如某个数据列表的计算需要花费很长时间而且很浪费服务器资源并且此列表不是需要经常更新的那么我们可以先将此数据列表事先key/value的方式缓存在内存中当有需要此数据时可以以key的方式去寻找此数据列表
如有一个DataSet对象ds将它存入缓存的办法是Cache[ds]=ds当程序需要调用这个ds对象的时候直接用Cache[ds]即可查询到数据值
除了Cache[ds]=ds将数据缓存外还提供了insert和add这两个方法将数据项添加到缓存因为这两个函数功能大致相同唯一区别就是insert函数有替换功能所以仅以insert作为示例简单说明下
Insert方法有四个重载函数
对上面四个重载函数我作简要说明
与Cache[ds]=ds类似就是将数据以key/value的形式添加到缓存
第二个重载函数多了一个CacheDependency类型的参数这个参数的意义是指定添加数据的依赖项比如某个数据列表是从一个xml加载进来的现在将此数据的依赖项设置为此xml文件当xml文件修改后此数据再缓存中自动删除下次调用时重新加入缓存这样可以保证缓存中的数据足够新
第三个重载函数不仅指明了依赖项还指明了缓存的有效时间即在依赖项一直没有修改的情况下过了有效时间缓存数据依旧自动删除
第四个重载函数是多了一个优先级和委托