天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

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流程的幾率很小,但總會影響效率,不知各位看客啊有什么更好的方法指點一下.

NET技術Web網站緩存文件并發問題解決方案,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲日韩欧美国产中文在线 | yellow高清免费观看日本 | 一级性生活毛片 | adc影院欢迎您大驾光临入口 | 一个人HD在线观看免费高清视频 | 精品国内自产拍在线观看视频 | 午夜理论电影在线观看亚洲 | 99久久精品免费看国产一区二区三区 | 精品无码久久久久久国产百度 | 51精品国产AV无码久久久 | 欧洲电影巜肉欲丛林 | 国产99青草全福视在线 | 狠狠色综合久久丁香婷婷 | 偷拍亚洲制服另类无码专区 | 色老头色老太aaabbb | 国产精品久久久久久久久久影院 | 老熟人老女人国产老太 | 在线色av| 国产精品系列在线一区 | 欧美性情video sexo视频 | 国产h视频在线观看网站免费 | 免费在线观看国产 | 强奸日本美女小游戏 | 亚洲人美女肛交真人全程 | 秋霞伦理高清视频在线 | 久久中文字幕无码A片不卡 久久中文字幕人妻熟AV女蜜柚M | 国产精品久久久久无码AV色戒 | 日本亚洲中文字幕无码区 | a级精品九九九大片免费看 A级韩国乱理伦片在线观看 | 蜜芽最新域名解析网站 | FREE17一18外女破 | 国产无线乱码一区二三区 | 亚洲中文久久久久久国产精品 | 国模孕妇模特季玥之粉红 | 91久久偷偷看嫩草影院无费 | 中字幕久久久人妻熟女天美传媒 | 含羞草影院AE在线观看 | 亚洲色欲国产AV精品综合 | 国产精品一久久香蕉国产线看 | 日日夜夜噜噜 | 最新国产精品视频免费看 |