建站学 - 轻松建站从此开始!

建站学-个人建站指南,网页制作,网站设计,网站制作教程

当前位置: 建站学 > 网站开发 > asp.net教程 >

网站性能优化之应用程序缓存-中篇(2)

时间:2010-09-20 00:09来源: 作者: 点击:
1、使用微软提供的服务器缓存的过期策略: a、相对过期。举个简单例子就是,如果缓存对象在某个时间段内没有被访问过,那么该对象则过期,否则则不过期。 b、绝对过期。举个简单例子就是,不管缓存的对象访问没有访

         1、使用微软提供的服务器缓存的过期策略:

         a、相对过期。举个简单例子就是,如果缓存对象在某个时间段内没有被访问过,那么该对象则过期,否则则不过期。

         image

         b、绝对过期。举个简单例子就是,不管缓存的对象访问没有访问过,只要到达设置的时间则过期。

 

 

         image

         具体的实现时,我们可以参考通过配置文件中设置这个过期策略,例如我们参考IBatisNet中的缓存

 

 

1 <cacheModels>//缓存的对象列表 
2 <cacheModel id="CacheLRU_Sys_UserRole"  implementation="LRU" >//缓存的对象 
3 <flushInterval minutes="2" />//设置过期策略 
4 <flushOnExecute  statement="Insert_Sys_UserRole"/>//刷新的动作 
5 <flushOnExecute  statement="Update_Sys_UserRole"/> 
6 <flushOnExecute  statement="Delete_Sys_UserRole"/> 
7 <property name="CacheSize" value="100"/>//设置缓存对象的大小 
8 </cacheModel
9 </cacheModels>

 

         显然通过上面提供的方式可以做到缓存对象的自动过期,但是有个情况就是不够灵活,如果缓存对象在指定的时间段内已发生改变,那么必须在过期时间后才能

更新缓存对象,那么有些时候显然不能满足我的要求,特别是实时性的系统时这样的缓存策略是不可行的。

        2、当然上面介绍的IBatisNet中已包含设置刷新对象时的操作的设置:

 

1 <flushOnExecute  statement="Insert_Sys_UserRole"/>//刷新的动作 
2 <flushOnExecute  statement="Update_Sys_UserRole"/> 
3 <flushOnExecute  statement="Delete_Sys_UserRole"/>

 

        那么体现在程序中的代码如何书写呢,我们来看看。

 

01 /// <summary>
02 /// 定义委托、用于指向更新缓存的事件
03 /// </summary>
04 /// <returns>返回是否更新缓存</returns>
05 public delegate bool RefreshCache(object sender, EventArgs e);
06  
07 /// <summary>
08 /// 维护缓存更新策略的委托集合
09 /// </summary>
10 public Dictionary<object, List<RefreshCache>> list;

 

 

        那么通过XML配置相关的引发缓存更新的事件来达到更新缓存的目的。

        那么每次委托列表中维护的对象即是所有的缓存对象的相关刷新动作事件。通过检测事件的执行来更新缓存对象。

        具体的更新缓存的代码如下:

 

1 public void RefreshCacheObject(object key,bool isSuccess) 
2
3    if (!isSuccess) 
4        return;
5    if (list.ContainsKey(key)) 
6         list.Remove(key);
7  
8     //载入缓存 
9  }

 

        具体的载入缓存的代码请参考:网站性能优化之应用程序缓存-初篇

        具体的实现底层通知的代码我还没有想好具体的实现方式(就是比较好的方式)。想好了会把代码贴上,当然IBatisNet已经很优秀了,我这里也许没有造轮子的必

要,如果谁有比较好的实现方式,那么可以告诉我,我这里先谢过了,我其实不是很了解底层的实现机制,所以我目前只是采用比较笨的方式来做,虽然也实现了,但

是需要在每个事件中都要显示的写一部分代码,这是我不能接受的。

        3、时时更新的方式。

        这里的时时更新就是指,每次都把数据库中的记录全部取出来,然后循环比较结果集中的记录与缓存的记录是不是相同,如果不同则更新该记录,否则跳过继续

处理其他的数据信息,那么保证缓存中的记录始终是最新的。当然这样的方式虽然保证所有的缓存信息是最新的,但是每次都与数据库交互显然不是好的解决方案,当

然有些情况下也许也是没有办法的事情。

        最后,本文只是抛砖引玉,希望大家多多提出宝贵意见。

六、本章总结

        本文简单的介绍了web与winform下的缓存策略,分析了几种方式的可行性及优缺点等,还希望大家在实际的项目中根据项目的需要来指定缓存的过期策略,但

是可以肯定的是,用缓存肯定比不用缓存的性能要高。当然这里也不是要求我们滥用缓存,也要根据数据信息的更新频度做一个平衡,不经常变的数据一般推荐来缓

存。毕竟服务器中有同一副本,不但能提高访问的效率,还能减轻数据库的访问压力,提高并发的速度。还需要大家在实际项目中体会。

七、下篇预告

        本篇并没有把IBatis.NET中的缓存策略完整的实现,并且也没有讲到其他的一些winform的缓存策略的实现,下一篇将会详细的讲解这部分的内容,当然这些都

是本人的个人体会与总结,错误之处在所难免,欢迎大家提出不同意见,批评指出错误,谢谢大家!

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片