快速业务通道

Discuz!NT 缓存设计简析

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-04-11
bsp;        1.项目到了beta版时出现了无法跨web园共享数据的问题。它的表现是这样的,当你在IIS
服务的应用程序池中设置2个或以上的WEB园时,这时你在后台更新缓存时,就是出现缓存
“隔三差五”数据不更新或轮换更新的情况。说白了,就是只有一个应用进程中的数据缓存
被更新,而其余的进程中所有数据还没事人似的保留原有的面貌。这个问题主要是因为static
的数据实例(也就是上面所有的单体代码中的对象)虽然而当前进程中“唯一”,但在其它进程
中却各自都有一个造成的。一开始我也很惊讶,为什么微软不能像提供“全局”钩子那样的技术
一样提供一种跨WEB园来共享数据的技术或关键字呢,不过一转念也猜出了一二分,必定多WEB园
是一种让程序(WEB)跑起来更加安全,稳定快速的“解决方案”。 因为谁都不好说自己的程序
一点BUG没有,即有真有这样的代码,但当遇上运行环境这个因素后,也会表现得有些难以控制。
但微软通过web园这个技术就会把运行在几个不同进程下的程序相互隔离,使其谁也不影响到谁,
即使其中一个进程down了,而其它进程依就会继续正常 "工作" 。因此程序中的对象实例和所有
资源每个进程中都会保存一份,完全相同。而如果引用共享机制就有可能出现当进程共享的数据
或程序对象出现问题时,所有进程就可能都玩完了, 因此就需要进程隔离。

         说是这么说,但总也要想个办法解决当时面临的问题吧。记得在豪杰工作期间,一次老梁
给我们开会,其中的一段话我至今还记忆犹新,他说CPU访问内存的速度和访问硬盘的速度在某些
情况下是相近的,如果我没理解的话比如说“虚拟缓存”或最新频繁访问的硬盘区段,这些地方
的代码或文件会有比较高的运行和访问效率。因此,我想到了使用文件标志关联的方法来解决这
个多进程问题。接着就顺理成章的使用了文件修改日期这个属性进行在多进程下缓存是否更新的
依据了,大家可以到开源下载包中的config文件夹下把一个cache.config的文件,对应最新的数
据项再回过头来看如下代码就会一清二楚了:

public static DNTCache CheckAndRemoveCache(DNTCache instance)//
 {
      //当程序运行中cache.config发生变化时则对缓存对象做删除的操作
      cachefilenewchange = System.IO.File.GetLastWriteTime(path);
      if (cachefileoldchange != cachefilenewchange)
      {
                lock (cachelockHelper)
                {
                    if (cachefileoldchange != cachefilenewchange)
                    {
                        //当有要清除的项时
                        DataSet dsSrc = new DataSet();
       

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号