達內廣州IT培訓
美國上市IT培訓機構

18589266248

熱門課程

.NET中Cache的應用

  • 時間:2016-08-03 19:40
  • 發布:廣州IT培訓學校
  • 來源:企業面試題

這次探討Cache 即高速緩存 ,我想很多人對他的第一印象一定像我一樣,感覺他一定能提高系統得性能和運行速度。Net推出cache的初衷確實是這樣的。那么cache是如何提高系統性能與運行速度呢?

這次探討Cache 即高速緩存 ,我想很多人對他的第一印象一定像我一樣,感覺他一定能提高系統得性能和運行速度。的確。Net推出cache的初衷確實是這樣的。那么cache是如何提高系統性能與運行速度呢?是不是在任何情況下用cache都能提高性能?是不是cache用的越多就越好呢?我在近期開發的項目中有所體會,寫下來當作總結也希望能跟大家一起探討探討,有錯誤的地方希望大家批評指正。

1.Cache 是如何工作的

Cache 是分配在服務器上的一個公共的內存片。

所謂公共指的cache只要一創建是任何一個客戶端瀏覽器都可以通過后臺代碼訪問到它,它面向的是所有用戶,相對而言session也是服務器上的一段內存,但他面向的是單個用戶。它是服務器的一段內存塊,也就是說每個cache一經創建就占用了服務器資源的。所以從這點來說我們就可以說:并不是cache越多越好。

cache 是有時間限制的,超過了服務器設定的過期時間,它就會被服務器回收。

c.cache 可以存放任何對象

2.Cache 如何創建以及如何銷毀

創建cache

在。Net環境下通過Cache.Insert(string key,object o)方法創建。其中key 代表cache的ID,o代表存到cache里的對象。

銷毀cache.

通過方法Cache.Remove(string key)其中key 代表cache的 ID.

調用cache.

Cache支持裝箱/拆箱操作。如你可以把一個DataSet對象ds通過Cache.Insert(“dsCache”,ds)的方式存到Cache中,可以通過拆箱操作 DataSet ds = (DataSet)Cache[“dsCache”]來訪問它。

3.什么時候用cache

Cache 一般用于數據較固定,用的較頻繁的地方。例如可以把進銷存系統中可以把產品信息存入cache,在用戶調用產品信息時通過調用cache即可,這樣從很大程度上減少了用戶與數據庫的交互,提高了系統的性能。反之,cache不適合用在數據變動快,使用范圍很窄的地方。例如把一個具體采購單存入 cache中。

4.cache 調用注意事項

Cache是有時間限制的。超過了服務器設置的過期時間,就會被服務器回收。當cache被回收后對應的內存塊就會被清空,再次通過cache[“cachekey”]訪問對象時返回的就是null值。所以以下這種調用就會出現異常

DataSet ds = (DataSet)Cache[“cacheds”];

DataRow dr = ds.Table[0].Row[0]; //出錯,ds為null值,不存在表0。

正確的寫法應該是:

DataSet ds

If(Cache[“cacheds”] != null)

{

ds = (DataSet)Cache[“cacheds”];

}

Else

{

ds= GetDsFromDataBase();

}

在.NET中,Cache的存在可以依賴多中方式,主要用到HttpContext.Current.Cache類

在這里,我主要寫幾種依賴方式

1:不依賴任何條件

HttpContext.Current.Cache.Insert(string cacheName,object obj)

理論上是Cache會永久保存,但是當服務器重新啟動,內存緊張的時候也會丟失.

2:HttpContext.Current.Cache.Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan

slidingExpiration);

//CacheDependency緩存依賴項,absoluteExpiration絕對過期時間,slidingExpiration最后一次訪問的時間隔

//我們主要講兩種Cache依賴

2.1:文件依賴,so simple//只要文件改動,Cache移出

HttpContext.Current.Cache.Insert(cacheName,ojb, new System.Web.Caching.CacheDependency(FilePath));

2.2:SqlServer數據庫依賴//我這里是SQL2005

首先看數據庫通知是否可用,記得一定要開啟通知

Select DATABASEpRoPERTYEX('數據庫名','IsBrokerEnabled');如果值為1表示可用

alter database Game176Admin set ENABLE_BROKER ;//開啟

alter database Game176Admin set DISABLE_BROKER;//關閉

在Global.asax文件中,我們在應用程序開始和結束時要做一些事情

void Application_Start(object sender, EventArgs e)

{

// 在應用程序啟動時運行的代碼

try

{

System.Data.SqlClient.SqlDependency.Start(string strCon);//開啟

}

catch { }

}

void Application_End(object sender, EventArgs e)

{

// 在應用程序關閉時運行的代碼

try

{

System.Data.SqlClient.SqlDependency.Stop(string strCon);

}

catch { }

}

準備工作已經完成

我們先寫一個方法,添加數據庫依賴

void AddSqlDependency(string strCon, string strSql, OnChangeEventHandler sqlDep_OnChange)

{

try

{

using (SqlConnection conn = new SqlConnection(strCon))

{

SqlCommand comm = new SqlCommand(strSql, conn);

SqlDependency sqlDep = new SqlDependency(comm);

sqlDep.OnChange += sqlDep_OnChange;

if (conn.State == ConnectionState.Closed) conn.Open();

comm.ExecuteNonQuery();

}

}

catch (Exception ex)

{

LogUtility.Add(ex);

}

}

//上面這個方法是告訴數據庫,當你指定表數據改變,要移出緩存

我們現在可以來添加了

MyObject obj= HttpRuntime.Cache["cacheName"] as MyObject;

if (null == obj)

{

try

{

obj= GetObj(...);

}

catch (Exception ex)

{

LogUtility.Add(ex);

obj= null;

}

if (null != obj)

{

AddSqlDependency(strCon, "select id from dbo.tableName;select id1 from dbo.tableName1",

delegate(object sender, SqlNotificationEventArgs e)

{

//do something

HttpRuntime.Cache.Remove("cacheName");

});

HttpRuntime.Cache.Insert("cacheName", obj);

}

}

上面SQL語句中用到的表,只要這些表中的任何數據有改動,數據庫都會通知,這時緩存會移動,select的字段和Cache沒有關系,只有表名有關系,所有你要選擇最小的字段.很多時候,為了這個字段,在設計表的時候都為多加一個最小的依賴列.

NOTE:任何Cache都可能丟失,使用前一定要做必要的檢查,如:

MyObject obj=HttpContext.Current.Cache("CacheName") as MyObject;

if(null==obj)

{

obj=.......

HttpContext.Current.Cache.Insert("CacheName",obj);

}

上一篇:web前端工程師企業面試題
下一篇:軟件測試面試必備的一些基礎理論概念

馬上預約三天免費體驗課

姓名:

電話:

web前端工程師企業面試題

C++ 類模板和模板類的深入解析

網頁設計師的職場規劃

軟件測試專業測試題

選擇城市和中心
江西省

貴州省

廣西省

海南省

中文字幕综合