ASP中的cache方法

之前介紹了在 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

原來如此~
受教了

阿倫

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *