在使用 asp.net 對於效能有相當幫助的 Cache 功能我特別感興趣, 這篇文章將針對 Cache 的用法做個介紹. (使用 c# 做範例程式語言)
Cache 是在 Page 中取得的一個屬性, 本身是一個在 System.Web.Caching.Cache 型態, 基本上可以想成一個共用的全域變數(很類似之前設在 Application 的變數), 然而, 其功能可以搭配許多相依性參數進行設置, 以期能達到網頁效能的提昇.
我們先來看一下 Cache 的基本使用方式:
(範例1)
protected void Page_Load( object sender, EventArgs e)
{
String strC1 = ( String) Cache["c1"];
if (strC1 == null) {
strC1 = DateTime.Now.ToString( "yyyy/MM/dd hh:mm:ss");
Cache.Insert( "c1", strC1);
}
Response.Write(strC1);
}
Cache 是在 Page 中取得的一個屬性, 本身是一個在 System.Web.Caching.Cache 型態, 基本上可以想成一個共用的全域變數(很類似之前設在 Application 的變數), 然而, 其功能可以搭配許多相依性參數進行設置, 以期能達到網頁效能的提昇.
我們先來看一下 Cache 的基本使用方式:
(範例1)
protected void Page_Load( object sender, EventArgs e)
{
String strC1 = ( String) Cache["c1"];
if (strC1 == null) {
strC1 = DateTime.Now.ToString( "yyyy/MM/dd hh:mm:ss");
Cache.Insert( "c1", strC1);
}
Response.Write(strC1);
}
less..
基本上, 就是利用 Cache 加上 key 來取得 value, 若是取回為 null , 則代表已過期被移除或尚未建立, 可以利用 Insert 方法進行新增一個存在 Cache 內的變數. 然而上面的方式, 除非自行手動移除或應用程式重起, 否則該 Cache 內的 c1 key 的值將會一直存在.
接下來要介紹的就是 Cache.Insert 的多載方法使用, 先將多載的這些函數整理列出如下:
1. Cache.Insert (String, Object)
2. Cache.Insert (String, Object, CacheDependency)
3. Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan)
4. Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan, CacheItemPriority, CacheItemRemovedCallback)
上述的 Object 可存放各種型態的變數, 只是要自己注意讀取轉型的問題.
第1點就是上面範例1使用的, 若不自行移除, 將會持續有效.
第2點有個 CacheDependency 的相依性參數設置, 這個功能相當強大, 可以相依多種條件, 基本上有 "檔案", "多個檔案", 前述二者加上開始監控時間, "多個檔案加上多個 key", "多個檔案加上多個 key 再加上另一個 CacheDependency", 前述二者加上開始監控時間, 一共有8種, 其中較為常用的就是檔案這個部分, 實務上通常就是用來監控檔案是否被異動過. 以下為一個範例:
(範例2)
protected void Page_Load( object sender, EventArgs e)
{
String strC1 = ( String) Cache["c1"];
if (strC1 == null) {
strC1 = DateTime.Now.ToString( "yyyy/MM/dd hh:mm:ss");
Cache.Insert( "c1", strC1, new System.Web.Caching. CacheDependency(Server.MapPath( "test.txt")));
}
Response.Write(strC1);
}
利用 Server.MapPath 對應出相對實體路徑下的檔案, 若該檔案 test.txt 異動(包含不存在後建立, 或是刪除, 或是修改)時, 將會讓該 Cache 的 key value 過期.
多個檔案的意思亦同, 多加上時間則是在指定的絕對時間後開始監控, 代表著一開始的 Cache 可以存活一定的時間. 豐富的 CacheDependency 可以該 Cache 的相依性有很大的彈性.
第3點則是再多加入了絕對時間和滑動時間的概念進來, 要特別注意的地方是絕對時間和滑動時間是不能同時使用的, 必須只指定其中一項, 若使用了絕對時間, 就要將滑動時間指定為 TimeSpan.Zero (或是System.Web.Caching.Cache.NoSlidingExpiration), 反之則要將絕對時間設定為 DateTime.MaxValue (或是System.Web.Caching.Cache.NoAbsoluteExpiration), 若同時指定兩者, 則會發生 ArgumentException 這個 exception, 而 CacheDependency 可以和二者任一一併使用, 若不使用, 則直接指定為 null 即可, 滑動時間是指最後一次讀取該 Cache key 後起, 再過多久過期, 以下為一個 CacheDenpendency 加上絕對時間的範例:
(範例3)
protected void Page_Load( object sender, EventArgs e)
{
String strC1 = ( String) Cache["c1"];
if (strC1 == null) {
strC1 = DateTime.Now.ToString( "yyyy/MM/dd hh:mm:ss");
Cache.Insert( "c1", strC1, new System.Web.Caching. CacheDependency(Server.MapPath( "test.txt")), DateTime.Now.AddSeconds(5), TimeSpan.Zero);
}
Response.Write(strC1);
}
這個範例則會相依性仍和範例2相同, 但多加了一個絕對時間為加入 Cache 時起算 5秒, 這兩者任一先發生, 則該 Cache 就過期, 使用絕對時間除了直接指定時間, 也可以用 AddSeconds, Add(xxx) 等方式指定相對於的時間方式, 而滑動時間則是用 TimeSpan.FromSeconds, From(xxx) 等方式指定相對時間, 所以修改一下加入該 Cache 的語法:
Cache.Insert( "c1", strC1, null, DateTime.MaxValue, TimeSpan.FromSeconds(5));
則代表著該 Cache key 在最後一次存取後起算 5秒才過期, 所以若是一直存取該 key 對應物件時, 會讓該物件一直處理非過期狀態, 也就是一直有效.
相信經過這樣介紹, 各位可以很容易地利用 Cache 來增進網頁的效態, 之後將再介紹 output cache 的方式, 相對於 Cache 物件, output cache 是更容易的, 敬請期待.
接下來要介紹的就是 Cache.Insert 的多載方法使用, 先將多載的這些函數整理列出如下:
1. Cache.Insert (String, Object)
2. Cache.Insert (String, Object, CacheDependency)
3. Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan)
4. Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan, CacheItemPriority, CacheItemRemovedCallback)
上述的 Object 可存放各種型態的變數, 只是要自己注意讀取轉型的問題.
第1點就是上面範例1使用的, 若不自行移除, 將會持續有效.
第2點有個 CacheDependency 的相依性參數設置, 這個功能相當強大, 可以相依多種條件, 基本上有 "檔案", "多個檔案", 前述二者加上開始監控時間, "多個檔案加上多個 key", "多個檔案加上多個 key 再加上另一個 CacheDependency", 前述二者加上開始監控時間, 一共有8種, 其中較為常用的就是檔案這個部分, 實務上通常就是用來監控檔案是否被異動過. 以下為一個範例:
(範例2)
protected void Page_Load( object sender, EventArgs e)
{
String strC1 = ( String) Cache["c1"];
if (strC1 == null) {
strC1 = DateTime.Now.ToString( "yyyy/MM/dd hh:mm:ss");
Cache.Insert( "c1", strC1, new System.Web.Caching. CacheDependency(Server.MapPath( "test.txt")));
}
Response.Write(strC1);
}
利用 Server.MapPath 對應出相對實體路徑下的檔案, 若該檔案 test.txt 異動(包含不存在後建立, 或是刪除, 或是修改)時, 將會讓該 Cache 的 key value 過期.
多個檔案的意思亦同, 多加上時間則是在指定的絕對時間後開始監控, 代表著一開始的 Cache 可以存活一定的時間. 豐富的 CacheDependency 可以該 Cache 的相依性有很大的彈性.
第3點則是再多加入了絕對時間和滑動時間的概念進來, 要特別注意的地方是絕對時間和滑動時間是不能同時使用的, 必須只指定其中一項, 若使用了絕對時間, 就要將滑動時間指定為 TimeSpan.Zero (或是System.Web.Caching.Cache.NoSlidingExpiration), 反之則要將絕對時間設定為 DateTime.MaxValue (或是System.Web.Caching.Cache.NoAbsoluteExpiration), 若同時指定兩者, 則會發生 ArgumentException 這個 exception, 而 CacheDependency 可以和二者任一一併使用, 若不使用, 則直接指定為 null 即可, 滑動時間是指最後一次讀取該 Cache key 後起, 再過多久過期, 以下為一個 CacheDenpendency 加上絕對時間的範例:
(範例3)
protected void Page_Load( object sender, EventArgs e)
{
String strC1 = ( String) Cache["c1"];
if (strC1 == null) {
strC1 = DateTime.Now.ToString( "yyyy/MM/dd hh:mm:ss");
Cache.Insert( "c1", strC1, new System.Web.Caching. CacheDependency(Server.MapPath( "test.txt")), DateTime.Now.AddSeconds(5), TimeSpan.Zero);
}
Response.Write(strC1);
}
這個範例則會相依性仍和範例2相同, 但多加了一個絕對時間為加入 Cache 時起算 5秒, 這兩者任一先發生, 則該 Cache 就過期, 使用絕對時間除了直接指定時間, 也可以用 AddSeconds, Add(xxx) 等方式指定相對於的時間方式, 而滑動時間則是用 TimeSpan.FromSeconds, From(xxx) 等方式指定相對時間, 所以修改一下加入該 Cache 的語法:
Cache.Insert( "c1", strC1, null, DateTime.MaxValue, TimeSpan.FromSeconds(5));
則代表著該 Cache key 在最後一次存取後起算 5秒才過期, 所以若是一直存取該 key 對應物件時, 會讓該物件一直處理非過期狀態, 也就是一直有效.
相信經過這樣介紹, 各位可以很容易地利用 Cache 來增進網頁的效態, 之後將再介紹 output cache 的方式, 相對於 Cache 物件, output cache 是更容易的, 敬請期待.