快取是在提升系統響應時常用的一種技術,在系統快取上通常採用的是有頁面快取、處理快取和資料快取這三種具體的類別,應該說這三種快取在實現上還是稍有不同,儘管底層的快取實現是一樣的。 頁面快取 頁面快取是指對頁面中的內容片斷進行快取的方案。比如頁面中有一個部分是顯示欄目中的內容的,那麼就可以快取這個部分,在進行第二次請求的時候就直接從快取中取出這部分的內容(其實就是這部分的html了),這種情況下,快取的作用其實非常明顯,在典型的action+service+dao這樣的結構中,在採用頁面快取後就意味著不需要經過action、service、dao這些層次的處理了,而是直接就返回了,對於系統響應速度的提升來說是非常明顯的。 頁面快取通常採用oscache來進行實現,oscache提供了一個jsp tag,可透過這個tag來包含需要快取的內容部分,當然,快取的這個內容部分需要有對伺服器的請求或邏輯計算等的,可想而知,去快取一段靜態html是沒有意義的。 其次需要定義快取的這段內容的key,例如我們要去快取頁面中某個欄目的某頁的內容,對於這段內容而言唯一的key就是欄目ID以及當前頁數,這樣就組成了這段快取的key了,其實這個部分看起來好像是很簡單,但有些時候會很麻煩,要仔細的想清楚這段內容的唯一的標識的key到底是什麼,^_^,通常的做法其實可以從action中需要獲取的引數或service介面的引數來決定.... 頁面快取中還需要做的一個步驟就是通知快取需要更新,頁面快取和其他快取稍有不同,需要告訴它,這個時候不能再使用快取中的內容了,需要從後臺再重新獲取來生成新的快取內容,這個其實很簡單,因為很難在後臺發生變化的時候自己來更新快取的內容,只能是去通知它,然後讓它再次發起請求來生成新的內容放入快取中。 頁面的快取的使用對於系統的響應速度確實會有很大的提升,在實現頁面快取時最麻煩的主要是快取的key的定義以及快取更新的通知,快取key的定義這個自然框架是沒法解決的,不過快取更新的通知其實在框架中可以考慮一種通知模型的,^_^,就像事件通知那樣........在實際的專案中,可以自己去實現一個這樣的通知模型或者就是簡單的採用單例方式來標識某個key是否需要更新。 頁面快取在實際的專案中使用非常的多。 處理快取 處理快取是指對於action、service、dao或者系統層次中的某方法進行快取,說直接點,就是對某個類的某個方法的結果做快取,這樣在下次進行完全相同的請求的時候就可以直接取快取了,這種響應速度的提升也是非常明顯的。 處理快取在現在的情況下其實採用任務的快取工具包都可以實現,如oscache、ehcache、jbosscache等,但目前還沒有處理快取框架的出現,這個和處理快取是否應該存在的意義也是有關係的,處理快取框架要做到的其實就像攔截一樣的方式,和oscache tag類似。 同樣,處理快取的麻煩也在於怎麼樣去定義這個key,很多情況下可以根據方法的輸入作為key,方法的輸出作為key的值,但也會有其他一些複雜的情況,這個時候定義key就會變得複雜些了。 處理快取同樣有通知更新快取的情況,和頁面快取基本是一樣的。 應該說,處理快取和頁面快取非常的相似,從實現上來說基本是完全一致的,在使用上來講處理快取使用的好像不多。 資料快取 資料快取估計大家都很熟悉,就是對系統的資料進行快取的方式,典型的就是Hibernate的一級、二級資料快取。 資料快取在實現上如果是用hibernate的話更多的是直接使用hibernate的一級、二級以及查詢快取,如果自己要實現的話可以去參考hibernate的實現機制。 資料快取的key在一級、二級快取中採用的都是資料的標識鍵的值的方式,查詢快取採用的是查詢引數、查詢語句的方式。 資料快取的更新則是hibernate在進行儲存時直接更新快取的內容,而對於查詢快取則是採用全部直接清除的方式,這樣在下次進行查詢時自然會重新去查詢,^_^,大家可能會想,為什麼頁面快取和處理快取不採用這樣的方式來實現快取的更新,稍微想想就知道了,在後臺發生改變的時候其實是不知道需要移除哪些key的,所以hibernate為了避免這個麻煩,採用的就是當資料一旦發生改變的時候就清除全部的查詢快取,而不是隻去清除相關的快取,其實這裡可以採用一種訂閱式的模型,呵呵,當然,也增加了框架的複雜度。 資料快取使用的應該是最多的,效果也是很明顯的。 以上三種快取是目前快取實現時通常碰到的三種狀況,裡面按使用的多少來排序應該是:資料快取、頁面快取和處理快取;實現的難度上從難到易的順序應該是:處理快取、頁面快取、資料快取;對於系統響應速度提升的效果來說從最好到好的順序應該是:頁面快取、處理快取、資料快取。 補充部分: 在SSH專案應用中,可以以物件的形式來快取展現給使用者的資料資訊。物件的快取要充分利用分組帶來的好處(可以分組刪除被快取的物件),這樣在執行資料庫的CUD操作時,可以呼叫刪除相應組別的快取物件。
快取是在提升系統響應時常用的一種技術,在系統快取上通常採用的是有頁面快取、處理快取和資料快取這三種具體的類別,應該說這三種快取在實現上還是稍有不同,儘管底層的快取實現是一樣的。 頁面快取 頁面快取是指對頁面中的內容片斷進行快取的方案。比如頁面中有一個部分是顯示欄目中的內容的,那麼就可以快取這個部分,在進行第二次請求的時候就直接從快取中取出這部分的內容(其實就是這部分的html了),這種情況下,快取的作用其實非常明顯,在典型的action+service+dao這樣的結構中,在採用頁面快取後就意味著不需要經過action、service、dao這些層次的處理了,而是直接就返回了,對於系統響應速度的提升來說是非常明顯的。 頁面快取通常採用oscache來進行實現,oscache提供了一個jsp tag,可透過這個tag來包含需要快取的內容部分,當然,快取的這個內容部分需要有對伺服器的請求或邏輯計算等的,可想而知,去快取一段靜態html是沒有意義的。 其次需要定義快取的這段內容的key,例如我們要去快取頁面中某個欄目的某頁的內容,對於這段內容而言唯一的key就是欄目ID以及當前頁數,這樣就組成了這段快取的key了,其實這個部分看起來好像是很簡單,但有些時候會很麻煩,要仔細的想清楚這段內容的唯一的標識的key到底是什麼,^_^,通常的做法其實可以從action中需要獲取的引數或service介面的引數來決定.... 頁面快取中還需要做的一個步驟就是通知快取需要更新,頁面快取和其他快取稍有不同,需要告訴它,這個時候不能再使用快取中的內容了,需要從後臺再重新獲取來生成新的快取內容,這個其實很簡單,因為很難在後臺發生變化的時候自己來更新快取的內容,只能是去通知它,然後讓它再次發起請求來生成新的內容放入快取中。 頁面的快取的使用對於系統的響應速度確實會有很大的提升,在實現頁面快取時最麻煩的主要是快取的key的定義以及快取更新的通知,快取key的定義這個自然框架是沒法解決的,不過快取更新的通知其實在框架中可以考慮一種通知模型的,^_^,就像事件通知那樣........在實際的專案中,可以自己去實現一個這樣的通知模型或者就是簡單的採用單例方式來標識某個key是否需要更新。 頁面快取在實際的專案中使用非常的多。 處理快取 處理快取是指對於action、service、dao或者系統層次中的某方法進行快取,說直接點,就是對某個類的某個方法的結果做快取,這樣在下次進行完全相同的請求的時候就可以直接取快取了,這種響應速度的提升也是非常明顯的。 處理快取在現在的情況下其實採用任務的快取工具包都可以實現,如oscache、ehcache、jbosscache等,但目前還沒有處理快取框架的出現,這個和處理快取是否應該存在的意義也是有關係的,處理快取框架要做到的其實就像攔截一樣的方式,和oscache tag類似。 同樣,處理快取的麻煩也在於怎麼樣去定義這個key,很多情況下可以根據方法的輸入作為key,方法的輸出作為key的值,但也會有其他一些複雜的情況,這個時候定義key就會變得複雜些了。 處理快取同樣有通知更新快取的情況,和頁面快取基本是一樣的。 應該說,處理快取和頁面快取非常的相似,從實現上來說基本是完全一致的,在使用上來講處理快取使用的好像不多。 資料快取 資料快取估計大家都很熟悉,就是對系統的資料進行快取的方式,典型的就是Hibernate的一級、二級資料快取。 資料快取在實現上如果是用hibernate的話更多的是直接使用hibernate的一級、二級以及查詢快取,如果自己要實現的話可以去參考hibernate的實現機制。 資料快取的key在一級、二級快取中採用的都是資料的標識鍵的值的方式,查詢快取採用的是查詢引數、查詢語句的方式。 資料快取的更新則是hibernate在進行儲存時直接更新快取的內容,而對於查詢快取則是採用全部直接清除的方式,這樣在下次進行查詢時自然會重新去查詢,^_^,大家可能會想,為什麼頁面快取和處理快取不採用這樣的方式來實現快取的更新,稍微想想就知道了,在後臺發生改變的時候其實是不知道需要移除哪些key的,所以hibernate為了避免這個麻煩,採用的就是當資料一旦發生改變的時候就清除全部的查詢快取,而不是隻去清除相關的快取,其實這裡可以採用一種訂閱式的模型,呵呵,當然,也增加了框架的複雜度。 資料快取使用的應該是最多的,效果也是很明顯的。 以上三種快取是目前快取實現時通常碰到的三種狀況,裡面按使用的多少來排序應該是:資料快取、頁面快取和處理快取;實現的難度上從難到易的順序應該是:處理快取、頁面快取、資料快取;對於系統響應速度提升的效果來說從最好到好的順序應該是:頁面快取、處理快取、資料快取。 補充部分: 在SSH專案應用中,可以以物件的形式來快取展現給使用者的資料資訊。物件的快取要充分利用分組帶來的好處(可以分組刪除被快取的物件),這樣在執行資料庫的CUD操作時,可以呼叫刪除相應組別的快取物件。