本人最近由於公司業務,需要把問卷的問題和答案存入緩存中已提高問卷載入速度,減少資料庫壓力。 緩存關鍵代碼(公司代碼已做封裝,這裡只貼出關鍵代碼): HttpRuntime.Cache.Insert(key, value, new CacheDependency(dependencyFile), ... ...
本人最近由於公司業務,需要把問卷的問題和答案存入緩存中已提高問卷載入速度,減少資料庫壓力。
緩存關鍵代碼(公司代碼已做封裝,這裡只貼出關鍵代碼):
HttpRuntime.Cache.Insert(key, value, new CacheDependency(dependencyFile), Cache.NoAbsoluteExpiration, slidingExpiration, CacheItemPriority.High, onRemoveCallBack);
該緩存存儲在了:IIS應用程式池中, 又使用的是相對緩存時間模式,一直等夠時間再操作不太現實,於是就是上網查資料加上詢問同事,找到了兩種解決辦法:
1-到對應伺服器IIS上手動回收應用程式池(緩存數據被清除,評估影響後使用)
2-修改項目的配置文件後,會觸發IIS應用程式池的回收時間。(可在IIS應用程式池高級設置里設置)
/// <summary> /// 插入緩存對象(相對過期時間,緩存依賴) /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <param name="slidingExpiration">相對過期時間</param> /// <param name="dependencyFile">文件依賴</param> /// <param name="onRemoveCallBack">緩存消失之後的處理方法</param> public static void Insert(string key, object value, TimeSpan slidingExpiration, string dependencyFile, CacheItemRemovedCallback onRemoveCallBack) { GenerateFile(dependencyFile); HttpRuntime.Cache.Insert(key, value, new CacheDependency(dependencyFile), Cache.NoAbsoluteExpiration, slidingExpiration, CacheItemPriority.High, onRemoveCallBack); }
參考資料文章: http://www.cnblogs.com/guohu/p/5209209.html
IIS可以設置定時自動回收,預設回收是1740分鐘,也就是29小時。IIS自動回收相當於伺服器IIS重啟,應用程式池記憶體清空,所有數據被清除,相當於IIS重啟,在度量快速開發平臺伺服器端,為了減小資料庫負擔,記憶體中暫存了很多信息,不適合頻繁的回收,因為回收會造成伺服器端所有存在記憶體中的數據丟失,如果沒有及時保存到資料庫中,可能導致程式出現問題。而如果系統使用高峰時期,並不適合回收,回收可能導致幾十秒IIS無響應,對於正在工作的人員來說,是一種很不好的體驗,會以為是網路或者掉線等問題。因此,基於以上的分析,我們需要設置IIS在指定的時間內定時回收。
度量快速開發平臺(以下簡稱:度量平臺)服務端搭建採用Webservice方式進行,這就需要正確的配置IIS(Internet Information Service)才能保證服務端可靠、穩定的運行,以給客戶提供更好的用戶體驗。IIS為保護伺服器資源,有一個應用程式池的回收功能,並且已經預設設置1740分鐘回收一次(29小時),為了更好的設置該屬性,我們有必要對IIS回收功能設置進行掌握,並根據應用的實際情況配合調整,以達到系統運行的最佳效果。
IIS應用程式池回收,找到相應的應用程式池並點擊高級設置,就可以看到回收的相關設置(本文以windows2008R2下的IIS7為例,Windows2012類似)。
(圖1)
發生配置更改時禁止回收:如果為True,應用程式池在發生配置更改時將不會回收。
固定時間間隔(分鐘):超過設置的時間後,應用程式池回收,為0意味著應用程式池不會按固定間隔回收。系統預設設置的時間是1740(29小時)。
禁用重疊回收:如果為true,將發生應用程式池回收,以便在創建另一個工作進程之前退出現有工作進程。
請求限制:應用程式池在回收之前可以處理的最大請求數。如果值為0,則表示應用程式池可以處理的請求數沒有限制。
生成回收事件日誌條目:每發生一次指定的回收事件時便產生一個事件日誌條目,裡面的明細設置不一一介紹。
根據度量平臺服務端配置情況看,IIS預設設置的1740分鐘回收進程的策略並不合理,因為每1740分鐘回收,在過程中可能就處於用戶使用系統的高峰時段,為避免可能在高峰時段引起非可控問題,我們建議在每周六深夜(例如晚上1點,2點)進行IIS回收。
如果我們在IIS應用程式池的高級設置中,進行回收設置,那麼只有兩種方式進行,一種是固定時間間隔,一種是手動回收。固定時間間隔設置,並不太好在深夜設置,以保證每周周六深夜執行回收。我們推薦採用windows “任務計劃程式”配置一個操作系統定時任務執行腳本程式來實現IIS回收,設置方便,也可以靈活調整。 要通過腳本執行IIS的功能,需要在IIS安裝配置的時候,勾選上管理工具中的“IIS管理腳本和工具”(見下圖)。
用vbs腳本及批處理文件,結合任務計劃程式,保證在每周六深夜1點執行IIS回收。
Recyclepool.vbs 文件內容: appPoolName = WScript.Arguments(0) Set oWebAdmin = GetObject("winmgmts:root\WebAdministration") Set oAppPool = oWebAdmin.Get("ApplicationPool.Name='" + appPoolName + "'") oAppPool.Recycle set fso=createobject("scripting.filesystemobject") if (fso.fileexists("d:\appPool\recycleIISPool.log")) then '1-forreading,2-forwriting,8-appending set file=fso.opentextfile("d:\appPool\recycleIISPool.log",8,ture) else set file=fso.createtextfile( "d:\appPool\recycleIISPool.log",8,ture) end if 'write(x)寫入x個字元,writeline寫入換行,writeblanklines(n)寫入N個空行 file.writeline now&" 應用程式池“"&appPoolName &"”已經回收成功。" file.close |
Recyclepool.bat文件內容: cscript D:\appPool\recyclepool.vbs platweb |
用vbs腳本及批處理文件,結合任務計劃程式,保證在每周六深夜1點執行IIS回收。
成功用windows計劃任務解決IIS定時回收問題。