緩存依賴、數據庫緩存依賴學習以及在LinQ當中使用緩存依賴


導讀:

◆緣起
◆緩存簡述
◆緩存依賴簡述
◆自定義緩存依賴分析
◆數據庫緩存依賴學習
◆LINQ緩存依賴實現
◆文檔更新說明
◆附:緩存依賴研究項目源碼(包括數據庫)
◆參考資料

 

一、緣起

(本文發布于博客園,作者在博客園的博客地址是:http://www.pxljau.live/xpnew/ 原文地址: http://www.pxljau.live/xpnew/archive/2012/05/03/LinQCacheDependency.html ,由于轉載會造成圖片、格式丟失,以及不能獲得文檔的最后更新,所以在此特別聲明)
最近做的一個客戶項目,客戶提出的要求是參數可定制,例如會員積分達到3000可以升一檔。
實現這個需求,其實很容易,只要把相關的參數都寫到數據庫或者xml文件當中,使用的時候再讀出然后作比較就可以了。
從性能優化的角度來講,當然不能是每次使用的時候都重新讀取一遍。
在asp時代,優化性能的一個關鍵就是把數據保存到Application和Session當中,到了asp.net時代,就提供了一個“更好”的工具:Cache。
以前就研究過Cache,不過因為需要優化的數據較少,所以仍然使用Application。
做到這個項目,雖然需要緩存的數據不多,但是因為通過緩存依賴可以“及時”獲得更新,所以決定下大力氣仔細研究一下。
我現在做東西使用的是LINQ,并且分成DALEntery、DAL、BLL、WEB這4層,所以不能直接使用數據庫緩存依賴,于是在網站找了好久,都沒有找到在LINQ當中使用緩存依賴的技術資料,最后沒辦法,只好研究其它的緩存依賴方式。
寫出這篇筆記之前,我的學習路線是:先看MSDN當中Asp.net當中使用緩存的部分,然后一些關于“自定義緩存”方面的技術博客,最后是“數據庫緩存依賴”的技術資料并且動手做了一些實驗,然后是總結分析。

二、緩存簡述

緩存的作用就減少對原始數據的訪問次數,提高性能。

緩存的使用方法,就是用Add或者Insert方法,把對象存儲到緩存當中。

 

緩存的技術需要研究超時、頁面緩存、緩存依賴等細節。


三、緩存依賴簡述

緩存依賴就是在正常的緩存到期之前,提前獲知原始數據已經更改,以最快的速度保持數據的同步。


緩存依賴有幾種形式:

文件、其它緩存、多對象依賴、數據庫緩存依賴、自定義緩存依賴

四、自定義緩存依賴分析

從網站看到了一堆資料之后,可以總結出以下幾點:

1、派生于CacheDependency


2、通過計時器來輪詢


3、需要自己實現比較和判定,以確定緩存是否已經更新/修改


五、數據庫緩存依賴學習

《系統緩存全解析6:數據庫緩存依賴》閱讀了兩遍之后,我自己動手做了一下實驗,實驗的結果和文章描述的完全一致。

為了進一步的理解,我又在數據庫里創建了“新聞”、“案例”兩個表,作為對比對象。

其中新聞使用了緩存,超時設置為15分鐘,案例沒有緩存。

實驗是在兩個頁面時行的,一個是list,一個是Insert。前者用GrideView控件顯示產品、新聞、案例的列表,后者用DetailsView控件插入數據。

 

實驗的現象一:

1、新添加的產品,立刻能顯示在列表頁上。

2、新添加的新聞,不會立刻顯示在列表頁上,直到15分鐘之后才出現。

3、新添加的案例,立刻能顯示在列表頁面上。


初步結論:使用緩存依賴,能夠保持數據的同步。

實驗的現象二:

新添加了產品,立即在列表頁面刷新,列表頁面有時候不能立即顯示。


進一步結論:

緩存依賴,是“理論”上的即時同步,并非真的分秒不差。究其根源,應該是因為緩存依賴,其實是基于輪詢的方式實現的。


然后打開數據庫,研究了一下,數據庫緩存依賴的原理終于真像大白了:

1、首先是在數據庫創建了一系列的存儲過程

2、然后是在數據庫創建了一個表:AspNet_SqlCacheTablesForChangeNotification

3、在需要監視的表上創建觸發器:[P_Product_AspNet_SqlCacheNotification_Trigger]

4、每次被監視的表上修改之后,都要通過觸發器=》存儲過程=》來修改表AspNet_SqlCacheTablesForChangeNotification相應的記錄。

5、Asp.net通過web.config的設置,輪詢數據庫里的表AspNet_SqlCacheTablesForChangeNotification

6、根據在Cache當中指定了的緩存依賴,比較表名(AspNet_SqlCacheTablesForChangeNotification的[tableName]字段)對應的changeId是否發生變化,判斷緩存源數據是否發生變化,然后決定緩存項提前過期。


六、LINQ緩存依賴實現

1、基礎工作:

創建表的觸發器,準備表修改記錄表,以及二者之間的存儲過程。
當然,這些可以直接使用Asp.net提供的這些功能。

2、在DAL層寫一個類“DBCacheDependencyDAL.cs”,實現查詢[表修改記錄表]的功能。

3、在BLL層寫一個類“LinQCacheDependencyServer.cs”實現自定義緩存依賴,這個類派生于CacheDependency,并且實現以下的細節:

TableName字段,保存要監視的表名

CurrentId字段,保存緩存創建時changeId字段的值,因為緩存失效時,會重新創建,所以這個屬性為只讀屬性。

DBCallBack(object sender)委托,這個委托會被傳遞給計時器調用,被調用的時候,它調用CheckTableChanged方法檢查表是否已經更新,如果已經更新,那么就會調用基類的NotifyDependencyChanged方法,通知依賴項已經更改。

CheckTableChanged方法:比較CurrentId字段和數據庫里的changeId字段,不同則表示已經更新。

4、在添加緩存的時候添加LinQCacheDependency類的實例,作為緩存依賴。

 

◆文檔更新說明:

2012年5月3日 17:00 

增加了附件,項目的源代碼。

增加了原文的鏈接。

 

◆附:緩存依賴研究項目源碼(包括數據庫)

 

◆參數資料:

 

《《解剖PetShop》系列之四 PetShop之ASP.NET緩存》
http://www.pxljau.live/wayfarer/archive/2006/11/01/547060.html


《系統緩存全解析6:數據庫緩存依賴》
http://www.pxljau.live/ltp/archive/2009/06/30/1514331.html


《ASP.NET 3.5核心編程學習筆記(38):自定義緩存依賴》
http://www.pxljau.live/free722/archive/2011/04/25/2028780.html

《asp.net 2.0 中使用自定義緩存依賴》
http://www.pxljau.live/sunwaywei/archive/2006/06/11/423312.html

 


《linq to sql中的自動緩存(對象跟蹤)》
http://www.mysjtu.com/page/M0/S438/438073.html

 

《緩存依賴》
http://hi.baidu.com/reallycan/blog/item/89cb5adff9d60c4f95ee3774.html

posted @ 2012-05-03 16:46  柳城之城  閱讀(...)  評論(...編輯  收藏
三d开奖结果走势图