Web网站缓存文件并发问题解决方案

我所负责的XXX.CN平台前期由于网站整体运行效率低因此采用了文件缓存的方式(文件缓存就是当某个页面第一次接受用户访问时将数据库中获取到的内容转化成xml文件的形式,并且存储在服务器硬盘当中,当后面的人再来访问时就只需要直接读取xml缓存文件即可,减少了读取数据库的次数,从而达到提高网站运行效率的目的),但是使用了这种方式其中有一个更新数据的问题,在更新和读取是就产生了并发的问题,说白了就是读取和写入的矛盾,当你的网站的访问量达到一定程度后,产生这种矛盾的概率越来越大,已至于访问者无法访问网站,流失了客户,对于我们酒店预订平台来说,流失的不是客户,而是白花花的金子,这个问题已经困挠了我许久,直到前几天,我在坐公交时回想起前一天给面试的人打印试卷的事,突然脑子里出现了“复制”这个词,并且把它扩展开想到了我们网站文件缓存的占用问题上,且已经用程序的方式成功运用到我们的网站中,下面就讲一下运行过程。

首先,我们网站整站的缓存方式都是依靠的DataSet的ReadXml和WriteXml的方式实现的,这种方式在访问量不是很大的网站中是一点问题都没有的(最大可承受的日IP估计在8000-15000左右),但是当你的网站日IP访问量到达20000时,他就完全崩溃了,出现xml的并发占用问题日趋严重,于是我们就采用了文件流的形式去操作,具体代码如下:
写入:
        Stream s = null;
        s = File.Open(FileName, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite);
        BinaryFormatter b = new BinaryFormatter();
        b.Serialize(s, ds);
        s.Close();
读取:
        Stream s = null;
        s = File.Open(FileName, FileMode.Open, FileAccess.Read);
        BinaryFormatter b = new BinaryFormatter();
        ds = (DataSet)b.Deserialize(s);
        s.Close();
这种方式在一定程度上解决了直接使用DataSet的ReadXml和WriteXml的方式带来的问题,但是当网站的日访问量达到40000或更高时,并发问题依然存在,其实存在并发的根本原因不是我们用了什么方式去读取或者写入(方式的不同的确在一定程度上可以解决一些问题,但根本原因没有得到根治),而是在两个或者更多个进程(有需要读取的也有需要写入的)在争抢同一个文件时程序如何给出一个可以让双方满意的方案,于是顺着这个思路,我有对程序做了以下改进:

//读取锁,可以让一个文件被多个进程同时读取,也可以保证只被一个进程改写
        ReaderWriterLock locker = new ReaderWriterLock();//读取锁()

写入:
       Stream s = null;
       try
      {
          locker.AcquireWriterLock(1500);//写锁定(写入时间最大允许在1500毫秒内完成,超时就立即退出)
          if (!File.Exists(FileName))
          {
                s = File.Create(FileName);
          }
          else
          {
               //创建此文件的一个副本,以供同时访问此文件的读取进程使用(就像打印机的复制功能),由于使用了写锁定,其他的写入进程都将转化为读取进程,而读取进程是不存在并发问题的
               File.Copy(FileName,FileName.Replace(".xml","Temp.xml"),true);
               s = File.Open(FileName, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite);
          }
          BinaryFormatter b = new BinaryFormatter();
          b.Serialize(s, ds);
          s.Close();
       }
       finally
      {
          if(s!=null)
          {
              s.Close();
          }
          locker.ReleaseWriterLock();//释放写锁定
          //这里可以加入删除临时文件的代码,但不建议这样做,我测试了下,会产生新的读写并发问题。
     }
读取:
        Stream s = null;
        Stream sTemp = null;
        try
       {
            locker.AcquireReaderLock(1500);//读锁定(当所用文件被写锁定时超时时间为1500毫秒)
            s = File.Open(FileName, FileMode.Open, FileAccess.Read);
            BinaryFormatter b = new BinaryFormatter();
            ds = (DataSet)b.Deserialize(s);
            s.Close();
       }
       catch//这里使用catch主要是因为当读取方法所读的文件正在被改写时会获取空内容导致异常,或者写入超时导致文件内容出错时异常,或者读锁定超时后读取临时文件时刚好临时文件被删除时发生异常
       {
            locker.ReleaseReaderLock();//释放锁
            locker.AcquireReaderLock(1500);//再次锁定
           if(File.Exists(FileName.Replace(".xml","Temp.xml")))
           {
                 //读取副本文件
                 sTemp = File.Open(FileName.Replace(".xml","Temp.xml"), FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                 BinaryFormatter b = new BinaryFormatter();
                 ds = (DataSet)b.Deserialize(s);
                 sTemp.Close();
           }
       }
       finally
       {
           if(s!=null)
           {
               s.Close();
           }
           if(sTemp!=null)
          {
               sTemp.Close();
          }
          locker.ReleaseReaderLock();
      }
好了,以上就是最终的改进方法,想通了很简单,就是创造个临时文件而已,从这件事我觉得大家在解决一个问题时不一定老是要从纯技术的角度去思考问题,之前我就想过用内存缓存的方式去做,但总觉得,会有一个更简单的方法的,于是使用了这种看似非常老土,而又没有任何技术含量的方式去解决了。不管使用哪种方式,能解决问题那就是好方法。其实想想世间万物都是相通的,只要我们发挥人类善于发掘和联想的能力,任何问题都不是问题。

另外,我在读操作中使用了try{}catch{},虽然进入catch流程的几率很小,但总会影响效率,不知各位看客啊有什么更好的方法指点一下.

时间: 2024-09-05 20:35:50

Web网站缓存文件并发问题解决方案的相关文章

艾伟_转载:Web网站缓存文件并发问题解决方案

我所负责的XXX.CN平台前期由于网站整体运行效率低因此采用了文件缓存的方式(文件缓存就是当某个页面第一次接受用户访问时将数据库中获取到的内容转化成xml文件的形式,并且存储在服务器硬盘当中,当后面的人再来访问时就只需要直接读取xml缓存文件即可,减少了读取数据库的次数,从而达到提高网站运行效率的目的),但是使用了这种方式其中有一个更新数据的问题,在更新和读取是就产生了并发的问题,说白了就是读取和写入的矛盾,当你的网站的访问量达到一定程度后,产生这种矛盾的概率越来越大,已至于访问者无法访问网站,

服务器-这些因素如何影响一个java web网站的并发数

问题描述 这些因素如何影响一个java web网站的并发数 服务器tomcat:最大连接数(maxThreads)和(acceptCount) 缓存redis:最大连接数(maxActive).最大空闲连接数(maxIdle) 数据源c3p0:最大连接数(maxPoolSize) 请教大牛解释这些参数和整个web网站并发数的关系

让黑客无隙可乘——企业级Web网站安全解决方案揭秘

在3月10日举办的阿里云网站热点研讨会上,阿里云资深安全业务架构师蕴藉就网站Web应用的安全性及业务可用性进行了一系列细致的讲解和介绍,接下来我们就来共同了解一下他分享的内容. 以下内容根据现场分享以及幻灯片整理而成 Web应用面临的主要安全问题:   现如今,大多数的互联网业务都以Web的方式进行,相较以往以PC浏览器为主的访问形式,移动App上的Web访问正逐渐成为主流.2014年推出的HTML5标准就是一个很好的例子,它为在移动设备上支持多媒体而设置,并得到了大范围的推广. 一个Web网站

Web网站的性能测试工具

随着Web 2.0技术的迅速发展,许多公司都开发了一些基于Web的网站服务,通常在设计开发Web应用系统的时候很难模拟出大量用户同时访问系统的实际情况,因此,当Web网站遇到访问高峰时,容易发生服务器响应速度变慢甚至服务中断.为了避免这种情况,需要一种能够真实模拟大量用户访问Web应用系统的性能测试工具进行压力测试,来测试静态HTML页面的响应时间,甚至测试动态网页(包括ASP.PHP.JSP等)的响应时间,为服务器的性能优化和调整提供数据依据. 我推荐各位Web 2.0开发测试人员使用Micr

构架高性能WEB网站的知识点

前言: 对于构架高性能的web网站大家都很感兴趣,本文从几点粗谈高性能web网站需要考虑的问题. HTML静态化 什么是html静态化? 说得简单点,就是把所有不是.htm或者.html的页面改为.htm或者.html 1.纯静态页面 当用户访问是,不需要经过服务器解析,直接就可以传送到客户端,此类型的页面,由于不需要解析就能直接访问,一般情况下,比动态页面的执行速度快. 2.静态化 页面静态化就是用动静结合的方式将动态网站生成静态网站来保存.这是实实在在的html文件,也就是静态页面. 3.

【问底】徐汉彬:Web系统大规模并发——电商秒杀与抢购

[导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设. 电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们会关注秒杀和抢购的技术实现和优化,同时,从技术层面揭开,为什么我们总是不容易抢到火车票的原因? 一.大规模并发带来的挑战 在过去的工作中,我曾经面对过5

php网站-PHP+MySQL+nigix web网站开发

问题描述 PHP+MySQL+nigix web网站开发 怎样在本地创建多个IP,比如默认是只有127.0.0.1,我想在增加几个比如127.0.0.2或127.0.0.3.要配置哪些文件,该怎么配置 解决方案 需要改两个地方,window里面的,还有mysql里的 解决方案二: windows里面需要在host文件中修改,以管理员身份运行,至于nigix不太熟悉. 解决方案三: 你是想用几个ip来模拟负载均衡.最好是找几台机器,然后nginx就可以配置upstream来导向多台服务器 解决方案

基于Web服务的应用、解决方案和开发平台

web|web服务|解决   架构Web Service: 基于Web服务的应用.解决方案和开发平台        内容: Public UDDI Registry Microsoft Halistorm Bowstreet Solution DealEasy Enterprise Portal Solution Web服务构建平台与服务组件 Microsoft .NET IBM Web Service Sun ONE Case Study: 实践Web服务 参考资料 作者简介 相关内容: 为什

空间-如何把制作好得java web网站发布

问题描述 如何把制作好得java web网站发布 用myeclipse把网站写好了,域名和空间都买好了,就是不知道怎么把它放到网上去,求各位大神解救,万分感谢 解决方案 http://blog.csdn.net/andydreaming/article/details/7086075http://wenku.baidu.com/link?url=WQCDIRP_FIngkriFGx9xg11h-j9pwfkt-JKkmboD6G1be0evHZzUWHAaN9j3QD7az-D3OEjtrNk8