1. Cache 是如何工作的。
Cache 是分配在服務器上的一個公共的內存片。所謂公共指的cache只要一創建是任何一個客戶端瀏覽器都可以通過後臺代碼訪問到它,它面向的是所有用戶,相對而言session也是服務器上的一段內存,但他面向的是單個用戶。它是服務器的一段內存塊,也就是說每個cache一經創建就佔用了服務器資源的。所以從這點來說我們就可以說:並不是cache越多越好。 cache 是有時間限制的,超過了服務器設定的過期時間,它就會被服務器回收。 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();
}
DataRow dr = ds.Table[0].Row[0];
在數據量不大的情況下,程序怎麼寫基本上性能差別不大,但是當我們面對數以萬計的數據的時候,我想性能就是個不得不考慮的問題了,每寫一個方法,每填充一筆數據都要考慮到性能問題,否則服務器將承擔巨大的執行開銷,如果服務器性能不好可能立即就死在那裏了,所以在大數據量頻繁訪問的頁面上,我們就必須考慮如何提高頁面的性能了,本文將提供一種用cache提高訪問性能的方法來解決此問題,在很大程度上提高頁面加載數據的性能。本文列舉的是論壇版塊中帖子列表頁面加載數據的實例。
2 boardCacheName = "Board" + boardID.ToString();
3 #endregion
4
2{
3 // 數據緩存 機制
4 if(Cache[boardCacheName] != null)
5 {
6 // Create DataTable From Cache
7 DataTable dt = (DataTable)Cache[boardCacheName];
8 return dt;
9 }
10 else
11 {
12 // Create DataTable From DataBase
13 DataTable dt = new DataTable();
14
15 -- Create DataTable --#region -- Create DataTable --
16 dt.Columns.Add("TopicID", System.Type.GetType("System.Int32"));
17 //省去N個類似字段的添加
18 dt.Columns.Add("CoolState", System.Type.GetType("System.Int32"));
19 DataColumn[] keys = new DataColumn[1];
20 keys[0] = dt.Columns[0];
21 dt.PrimaryKey = keys;
22 #endregion
23
24 -- Add DataRow --#region -- Add DataRow --
25 BBSTopicCollection btc = new BBSTopicCollection();
26 btc.BoardID = this.boardID;
27 btc.TopicState = 1;
28 if(!btc.GetInfo())
29 {
30 return dt;
31 }
32 for(int i=0;i<btc.Count;i++)
33 {
34 DataRow dr = dt.NewRow();
35 // 帖ID
36 dr["TopicID"] = btc[i].ID;
37 //省去N個類似字段的數據賦值
38 // Cool State
39 dr["CoolState"] = btc[i].CoolState;
40 dt.Rows.Add(dr);
41 }
42 #endregion
43
44 // Push DataTable To Cache
45 Cache[boardCacheName] = dt;
46 return dt;
47 }
48}
49
2 if(Cache["Board" + this.boardID.ToString()] != null)
3 {
4 DataTable dt = (DataTable)Cache["Board" + this.boardID.ToString()];
5 DataRow dr = dt.Rows.Find(topicID);
6 if(dr != null)
7 {
8 dr["CoolState"] = 1;
9 dr.AcceptChanges();
10 dt.AcceptChanges();
11 }
12 }
13 #endregion
14