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