之前介紹了在 ASP.NET 中的 cache 方式, 現在來看看 ASP 中的 cache 方式.
由於 ASP 中沒有內建的 cache 物件, 所以沒辦法利用 ASP 中的內建的方式來進行 cache, 如前篇所言, cache 類似全域物件的 Application , 所以實作 ASP 的 cache 方法, 就是利用 Application 來實作囉.
這裡利用了兩個變數, exp_”cacheToken” 及 data_”cacheToken” 兩個 Application 的變數來進行操作, 程式碼如下:
Function getCacheValue(cacheToken) If CDate(Application("exp_" & cacheToken)) >= Now Then getCacheValue = Application("data_" & cacheToken) Else getCacheValue = "" End If End Function Function setCacheValue(cacheToken, cacheValue, cacheSecond) Application.Lock Application("data_" & cacheToken) = cacheValue Application("exp_" & cacheToken) = DateAdd("s", cacheSecond, Now) Application.Unlock End Function
基本上, 使用 Application 的時候, 要注意寫入鎖定的問題, 讀取時沒有這個問題, 所以這是比較要注意的地方, 接下來簡單說明一下使用方式:
getCacheValue 為取出 cache 的資料, 利用 token 做為索引, 而資料原則上可以放置 variant 的型態, 但建議放比較單純的資料, 例如字串, 以增進效能, 若是該資料已過期或不存在時, 則回傳空字串.
setCacheValue 為設定 cache 資料, 傳入 token, value 及 TTL (以秒為單位), 如此一來便能有效地管理這些 cache 的資料, 當然隨時想更新, 可以直接利用 setCacheValue 設定即可, 注意 Application 寫入時, 要先取得鎖定權, 如此方能避免資料競爭問題(race condition).
至於如何應用的 pattern 如下:
sData = getCacheValue("myToken") If sData = "" Then sData = ComputeSomethingFunc("xxx") setCacheValue "myToken", sData, 180 End If Response.Write sData
如此一來 sData 可以利用 Application 中的 data_myToken 資料來做為快取資料, 其中有 180 秒的存活期, 若在存活期內, 就直接取用, 若過期時, 才調用負載較大的 ComputeSomethingFunc 來進行運算, 這類應用通常用於資料庫展示產品資料時使用, 可以大幅降低查詢的頻率, 以提升效能.
延伸閱讀: http://www.eeffee.com/index.php/action_viewnews_itemid_25339.html
allenliao 2006/12/08 10:08
提姆老大~我找資料又找這來了~
哈哈~
這文章真不是蓋的請教一下老大
Application變數有資料大小的限制嗎?因為會佔用SERVER的記憶體?
還是因為什麼原因要改用ADODB.Stream
把資料變成文字檔放在servers呢?
阿倫
Timothy 2006/12/10 14:56
使用 Application 變數基本上沒有太多限制, 大小不是太大的問題, 因為 Application 是全域變數, 比較重要是在於存取的控制, 要特別注意寫入時鎖定的時間掌握, 這是會影響效能的, 另外使用 ADODB.Stream 存檔的原因是因為資料量過大或是要將頁面做成檔案時使用的技巧. 特別去使用 ADODB.Stream 而不用 Scripting.FileSystem 是因為 Encoding 為 UTF-8 的關係!!
allenliao 2006/12/12 07:50
原來如此~
受教了阿倫