緩存:前端頁面緩存、服務器緩存(依賴SQL)MVC3


緩存依賴數據庫

  第一步

1通過vs里面帶的命令提示窗口。

2或者.NET Framework 版本 4(64 位系統)條件,%windir%\Microsoft.NET\Framework64\v4.0.30319目錄下找到aspnet_regsql.exe, 執行下面cmd命令

aspnet_regsql -S .\LK -E  -ed -d CommunicationPlatformByLK -et -t UserInfor

-S 服務器,-E windows認證方式  -ed -d緩存的數據庫  -et -t緩存的數據表。

如果你想查為起的緩存表起名,或者改變認證方式等要求,查一查。畢竟咱們做的是例子。

這樣命令之后,在緩存的數據庫中會建立一個數據表,具有觸發功能。

            

  第二步

配置文件:注意第一個連接節點是EF幫我們生成的,用這個是不行的,第二個是我手動加上的,用這個才行。所以用ef或者其他的朋友注意這點。

<connectionStrings>
        <add name="ModelContainer" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=LIKE-PC\LK;initial catalog=CommunicationPlatformByLK;user id=sa;password=sa;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
        <add name="CommunicationPlatformByLK" connectionString="data source=.\LK;Integrated Security=SSPI;
initial catalog=CommunicationPlatformByLK;" />
    </connectionStrings>
system.web>
        <caching>
            <sqlCacheDependency enabled="true" >
                <databases>
                    <add name="Test" connectionStringName="CommunicationPlatformByLK" pollTime="500"  />
            //name隨便起,后面的connectStringName是新添加連接字符串的鍵名,500以ms為單位,采用的輪詢機制,程勛每0.5s問檢測數據庫是否發上變化 </databases> </sqlCacheDependency> </caching>

  第三步

記得SqlDependency里面的值是,配置文件的值=name:起緩存的數據表名

 [OutputCache(Duration = 60, SqlDependency = "Test:UserInfor",Location=System.Web.UI.OutputCacheLocation.ServerAndClient)]
        public ActionResult GetAllUserInfos()
        {           
            int pageIndex = int.Parse(Request["page"]);
            int pageSize = int.Parse(Request["rows"]);
            int rowcount = 0;
            IQueryable<UserInfor> pageEntityList = userInforService.SelectPageEntityList<int>(u => u.ID, u => u.ID > 0, pageIndex, pageSize, false, out  rowcount);
            var result = new { total = rowcount, rows = pageEntityList };
            return Json(result, JsonRequestBehavior.AllowGet);

        }

注意:理解:既然有的polltime,為什么打的標簽還有duration參數。

答案:在duration時間內,只要數據庫表沒有變化,會一直讀取服務器緩存(不會執行action方法體),但是只要數據庫發生變化,並且保證polltime已經到了,duration時間就不起作用了。

所以我們一般蛇者polltime很小,設置duration很長。

有人說duration沒什么用,去掉不行嗎?答案是不行的~~因為duration是必須的參數。雖然沒什么主要用途。  

 

頁面緩存

   注意1

    前台讀取客戶端緩存,用get,非post。因為get請求方式參數不變的情況下,默認會讀取瀏覽器緩存。但post方式不會如此。

   注意2

    OutputCache的參數有默認值,location默認客戶端和服務端都有,varyby..默認根據參數。 

    VaryByHeader = "User-Agent"換瀏覽器讀取數據庫,VaryByParam = "a"隨便定義一個參數,就防止隨着參數值變化而變化。

   注意3

    google顯示正確,讀取客戶端緩存,但是ie firefox並沒有。但是服務器緩存都是正常讀取的。

讀取服務器緩存本質:(當第一次請求執行一個action,會執行里面的方法體,在duration時間內,多次請求這個action,不再執行里面的方法體,而直接從服務器端的緩存發來)

在controller或者action上面寫上[OutputCache(Duration=20....)],因為controller有很多action,如果單在controller上面寫,所有action都會建立對應的頁面的緩存,並一定適用,所以一般用到哪一個action,就在上面打上此標簽便可。

那實際開發中的項目寫一個例子。

action

 1     [OutputCache(Duration = 60)]
 2         public ActionResult GetAllUserInfos()
 3         {
 4             int pageIndex = int.Parse(Request["page"]);
 5             int pageSize = int.Parse(Request["rows"]);
 6             int rowcount = 0;
 7             IQueryable<UserInfor> pageEntityList = userInforService.SelectPageEntityList<int>(u => u.ID, u => u.ID > 0, pageIndex, pageSize, false, out  rowcount);
 8             var result = new { total = rowcount, rows = pageEntityList };
 9             return Json(result, JsonRequestBehavior.AllowGet);
10         }

前台easyui:注意一定是get方式,非post方式。因為get請求方式參數不變的情況下,默認會讀取瀏覽器緩存。但post方式不會如此。

        function initGrid() {
            $('#tt').datagrid({
                url: '/UserInfor/GetAllUserInfos',
                title: '演示表格使用',
                width: 900,
                method:'get',
                height: 400,
         //*****省略

google

              

google response

                   

IE

        

IE response

        

IE 響應正文

      

google顯示304而ie顯示200,其余cache-control 都有max-age(服務器的剩余緩存時間),都有從數據庫的緩存中返回數據。

確定的是,ie和google都在duration時間內,action的代碼不會被執行。google返回304,讀取了客戶端緩存,但是服務器緩存返回了數據。

ie返回200,沒有讀取客戶端緩存(是沒在客戶端形成緩存嗎?)。也返回了服務器緩存。

 

按照網上資料,在action中添加Response.Cache.SetOmitVaryStar(true);,最終結果沒卵用。有毛病這是.

google變成了200,但是action代碼在duration時間內不會執行里面方法體。也返回了數據。但是max-age一直是服務器的緩存時間,木有減少等變化。

google

          

ie

ie也是200,也返回了服務器緩存數據,action方法體沒執行,沒有讀取客戶端緩存(還是沒有創建客戶端緩存?)

            

就將就依靠服務器緩存來做緩存吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM