.net中Petshop4.0 緩存設計學習教程

PetShop是一個範例,微軟用它來展示.Net企業系統開發的能力。業界有許多.Net與J2EE之爭,許多數據是從微軟的PetShop和Sun的PetStore而來。

Asp.net 2.0新增的緩存管理:
CacheDependency跟蹤緩存依賴項,緩存依賴項可以是應用程序的 Cache 中的文件、目錄或與其他對象的鍵。
SqlCacheDependency類在所有受支持的 SQL Server 版本 (7.0, 2000, 2005) 上監視特定的 SQL Server 數據庫表,以便在該表發生更改時,自動從 Cache 中刪除與該表關聯的項。 數據庫表發生更改時,將自動刪除緩存項,並向 Cache 中添加新版本的項。在使用 SQL Server 2005 數據庫時,SqlCacheDependency 類還支持與 System.Data.SqlClient.SqlDependency 類進行集成。使用 SQL Server 2005 的查詢通知機制來檢測使 SQL 查詢結果無效的數據更改。與 SQL 查詢關聯的任何緩存項都將從 System.Web.Caching.Cache 中移除。在使用 SQL Server 2005 時,可以使用 SqlCacheDependency 類向應用程序的 Cache 添加依賴于 SQL Server 數據庫表或 SQL 查詢的項
AggregateCacheDependency類監視依賴項對象的集合,以便在任何依賴項對象更改時,該緩存項都會自動移除。數組中的對象可以是 CacheDependency對象、SqlCacheDependency 對象、從 CacheDependency派生的自定義對象或這些對象的任意組合.
AggregateCacheDependency類與 CacheDependency類的不同之處在于前者允許您將不同類型的多個依賴項與單個緩存項關聯。例如,如果您創建一個從 SQL Server 數據庫表和 XML 文件導入數據的頁,則可創建一個 SqlCacheDependency對象來表示數據庫表的依賴項,以及一個 CacheDependency來表XML 文件的依賴項。可創建 AggregateCacheDependency類的一個實例,將每個依賴項添加到該類中,而不是爲每個依賴項調用 Cache.Insert 方法。然後,可使用單個Insert 調用使該頁依賴于 AggregateCacheDependency實例。
舉個例子說吧:
下面是爲Petshop 4.0 中,product建立緩存依賴。下面是實現:
publicstatic IList<ProductInfo> GetProductsByCategory(string category)
{
Product product =new Product();
if (!enableCaching)
return product.GetProductsByCategory(category);
string key ="product_by_category_"+ category;
IList<ProductInfo> data = (IList<ProductInfo>)HttpRuntime.Cache[key];
if (data ==null)
{
data = product.GetProductsByCategory(category);
// Create a AggregateCacheDependency object from the factory
AggregateCacheDependency cd = DependencyFacade.GetProductDependency();
HttpRuntime.Cache.Add(key, data, cd, DateTime.Now.AddHours(productTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
}
return data;
}
引入Facade模式
在PetShop 4.0的設計中,是通過引入Facade模式以方便調用者更加簡單地獲得AggregateCacheDependency類型對象,引入Facade模式。
利用Facade模式可以將一些複雜的邏輯進行包裝,以方便調用者對這些複雜邏輯的調用。就好像提供一個統一的門面一般,將內部的子系統封裝起來,統一爲一個高層次的接口。Facade模式的目的並非要引入一個新的功能,而是在現有功能的基礎上提供一個更高層次的抽象,使得調用者可以直接調用,而不用關心內部的實現方式。以CacheDependency工廠爲例,我們需要爲調用者提供獲得AggregateCacheDependency對象的簡便方法,因而創建了DependencyFacade類:
publicstaticclass DependencyFacade {
privatestaticreadonlystring path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
publicstatic AggregateCacheDependency GetProductDependency()
{
if (!string.IsNullOrEmpty(path))
return DependencyAccess.CreateProductDependency().GetDependency();
else
returnnull;
}
}
DependencyFacade類封裝了獲取AggregateCacheDependency類型對象的邏輯,如此一來,調用者可以調用相關方法獲得創建相關依賴項的AggregateCacheDependency類型對象:
AggregateCacheDependency dependency = DependencyFacade.GetCategoryDependency();
比起直接調用DependencyAccess類的GetDependency()方法而言,除了方法更簡單之外,同時它還對CacheDependencyAssembly配置節進行了判斷,如果其值爲空,則返回null對象。
CacheDependency工廠
繼承了抽象類TableDependency的Product、Category和Item類均需要在調用時創建各自的對象。由于它們的父類TableDependency實現了接口IPetShopCacheDependency,因而它們也間接實現了IPetShopCacheDependency接口,這爲實現工廠模式提供了前提。在PetShop 4.0中,依然利用了配置文件和反射技術來實現工廠模式。命名空間PetShop.CacheDependencyFactory中,類DependencyAccess即爲創建IPetShopCacheDependency對象的工廠類:
namespace PetShop.CacheDependencyFactory
{
publicstaticclass DependencyAccess
{
publicstatic IPetShopCacheDependency CreateProductDependency()
{
//創建PetShop.TableCacheDependency.Product實例,並把緩存依賴放入到AggregateCacheDependency中見TableDependency構造函數
return LoadInstance("Product");
}
//利用反射技術創建實體PetShop.TableCacheDependency.Product實例
privatestatic IPetShopCacheDependency LoadInstance(string className)
{
//<add key="CacheDependencyAssembly" value="PetShop.TableCacheDependency"/>配置文件獲取程序集名稱+className創建CacheDependency實例
string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
string fullyQualifiedClass = path +"."+ className;
// Using the evidence given in the config file load the appropriate assembly and class
return (IPetShopCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);
}
}
}
構建Product CacheDepency
PetShop 4.0引入了SqlCacheDependency特性,對Category、Product和Item數據表對應的緩存實施了SQL Cache Invalidation技術。當對應的數據表數據發生更改後,該技術能夠將相關項從緩存中移除。實現這一技術的核心是SqlCacheDependency類,它繼承了CacheDependency類。然而爲了保證整個架構的可擴展性,我們也允許設計者建立自定義的CacheDependency類,用以擴展緩存依賴。這就有必要爲CacheDependency建立抽象接口,並在web.config文件中進行配置。
在PetShop 4.0的命名空間PetShop.ICacheDependency中,定義了名爲IPetShopCacheDependency接口,它僅包含了一個接口方法
publicinterface IPetShopCacheDependency
{
{
AggregateCacheDependency GetDependency();
}
}
TableDependency的實現正是爲Category、Product和Item數據表建立了對應的SqlCacheDependency類型的依賴項
publicabstractclass TableDependency : PetShop.ICacheDependency.IPetShopCacheDependency
{
// 獲取表的分隔符<add key="ProductTableDependency" value="Product,Category"/>
protectedchar[] configurationSeparator =newchar[] { ',' };
protected AggregateCacheDependency dependency =new AggregateCacheDependency();
protected TableDependency(string configKey) {
string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];//數據庫名
string tableConfig = ConfigurationManager.AppSettings[configKey];
string[] tables = tableConfig.Split(configurationSeparator);
foreach (string tableName in tables)
dependency.Add(new SqlCacheDependency(dbName, tableName));
}
public AggregateCacheDependency GetDependency() {
return dependency;
}
}
/// Method to create an instance of Product dependency implementation
///創建Product實例,因爲Product繼承了TableDependency
根據各個數據表間的依賴關系,因而不同的數據表需要建立的依賴項也是不相同的,從配置文件中的value值可以看出。然而不管建立依賴項的多寡,其創建的行爲邏輯都是相似的,因而在設計時,抽象了一個共同的類TableDependency,並通過建立帶參數的構造函數,完成對依賴項的建立。由于接口方法GetDependency()的實現中,返回的對象dependency是在受保護的構造函數創建的,因此這裏的實現方式也可以看作是Template Method模式的靈活運用。例如TableDependency的子類Product,就是利用父類的構造函數建立了Product、Category數據表的SqlCacheDependency依賴:
publicclass Product : TableDependency
{
public Product() : base("ProductTableDependency") { }
}
/*----------------------------------------------------------------------------------------------------------------*/

更多相關文章
  • linux的dns緩存服務-nscd學習筆記
    nscd緩存三種服務passwd group hosts,所以它會記錄三個庫,分別對應源/etc/passwd, /etc/hosts 和 /etc/resolv.conf每個庫保存兩份緩存,一份是找到記錄的,一份是沒有找到記錄的.每一種緩存都保存有生存時間(TTL).開啓 .停止. 重啓服務sev ...
  • 下面我們來看看關于Bootstrap入門之Bootstrap3.0學習教程,希望例子能夠幫助到各位朋友,有興趣的朋友可以和小編來看看吧.菜單下拉菜單將下拉菜單觸發器和下拉菜單都包裹在.dropdown裏,然後添加組成菜單的HTML代碼.<div class="dropdown&quo ...
  • wordpress 中 wp Super Cache 緩存插件安裝使用教程
    WP Super Cache 是一款wordpress靜態緩存插件,它可以整個wordpress生成HTML文件,本文就來講講 wp Super Cache 緩存插件如何使用.WordPress靜態緩存插件很多,我們現在講一個非常常用的靜態緩存插件WP Super Cache的基本使用方法,包括插件 ...
  • emlog使用的是文件緩存了,不管文件緩存多好也好不過memcache緩存了,關于memcache緩存優于文件緩存我們就不介紹了,下面簡單的看看配置方法吧.這次只是簡單的HACK emlog cache程序,使用memcache緩存,畢竟memcache緩存在記憶體, 文件緩存在硬盤(要看I/O的效 ...
  • HTML5中應用程序離線緩存Application Cache實例教程
    以前的web程序中浏覽器也對資源文件進行cache,但並不是很可靠,經常達不到預期的效果.而HTML5中的application cache支持離線資源的訪問,爲離線web應用的開發提供了可能.什麽是Application CacheHTML5引入了應用程序緩存技術,意味著web應用可進行緩存,並在 ...
  • wordpress中Hyper Cache緩存插件安裝和使用方法
    網頁找開速度慢,跟很多因素有關:伺服器.代碼.程序等.當然,換一個更快的伺服器倒是挺省力,但是需要的費用也是不小.作爲一個wordpress網站的站長,想讓自己的小站速度有所提升,我們還可以通過提速插件來實現一定的速度提升.本文就來介紹wordpress提速插件中比較小巧但又很管用的緩存插件——Hy ...
  • .NET中用memcached緩存及Memcached.ClientLibrary使用教程
    Memcached是一個高效能的分布式記憶體對象緩存系統,用于動態Web應用以減輕數據庫負載.本文主要講講memcached分布式緩存的負載均衡配置比例,數據壓縮,socket的詳細配置等,以及在.net中的常用方法.memcached在windows下的下載與安裝官方網站:http://memca ...
  • 在Centos6系統是我們可以直接使用iptables防火牆來做一些安全配置,如端口,屏蔽IP,流量等等一些操作,下面我把自己在學習iptables防火牆設置一些命令總結一下,與各位同學分享.iptables簡介iptables是基于內核的防火牆,功能非常強大,iptables內置了filter,n ...
一周排行