系統級信息Cache的實現
這篇Blog接著上篇Blog提出的場景進行解決方案的描述:
在一個信息列表中,每個信息的權限有多種情況,比如信息列表中存在A、B、C三條信息,各條信息的權限授予給了(guest,admin)、(guest)、(admin),這個時候要獲取guest的信息列表,加入cache需要提高效率的地方就在于避免獲取信息列表時需與數據庫進行實時的查詢,同時要注意,一般來說,系統的信息數據量會是比較的大。
在和江南白衣聊的時候他提出了oscache提供的cache:cache標簽的解決方案,開始想了一下覺得不怎么可行,這也是因為自己對cache標簽不熟的原因,后來去網上查了一下cache:cache標簽的使用,看了后覺得對于解決上面的需求應該是可行的。
關于cache:cache標簽的具體用法網上有很多文章,大家可以google查找,我這里主要講講它的實現思路,在使用oscache提供的這個標簽主要是通過以下方法來實現的
<cache:cache>
// jsp代碼
</cache:cache>
中間的jsp代碼表明需要被緩存的東西,cache標簽還提供了key,refresh,time,duration等等屬性,對于上面的需求我們通常想的方案都是做數據庫級的緩存,避免頻繁實時查詢數據庫,cache標簽這種做法的想法卻是從入口開始入手,緩存入口自然也就實現了所需要的效果。
要使用cache標簽首先需要明確緩存的jsp代碼頁面是由哪些關鍵字可以唯一標識出來的,在上面的需求中我們可以得知可以根據用戶Id+當前頁數+訪問的信息類型的ID來唯一標識該頁面,那么我們就可以把這個作為cache的key(默認key為uri加上請求的參數),緩存的過期時間可以設為-1(也就是不過期),這個時候我們就得考慮當信息的權限以及信息的數量變更時緩存是得刷新的,通過refresh屬性可以達到這個目的,可以建立一個singleton的類來標識哪些信息ID是需要更新緩存的,refresh屬性則通過調用此singleton類來確定是否需要更新緩存,這樣的情況下需求中所要的效果就實現了,在這種解決方案中我們需要做的就是在對信息進行管理時調用singleton類來標識此id是需要被更新緩存的,在頁面上我們只需要定義出能夠唯一標識出需緩存頁面部分的唯一key(如果能夠通過uri加上請求參數作為唯一標識的情況下就不用定義key了,不過在需要權限過濾的地方一般來說是需要自己定義key的,因為要獲取當前的用戶ID),調用singleton獲取refresh的屬性,之后加入cache:cache標簽就搞定了。
其實從上面的解決方案中我們可以推測oscache標簽的實現思路,非常的簡單,和通常我們做緩存的思路都一樣,只是它提供了對于緩存的一個很好的處理機制,那就是從入口下手,在第一次運行頁面的時候,它通過將生成的html作為value緩存到對應的key中,第二次運行頁面時它通過此key去獲取html,如無此key則運行jsp代碼,同理其實可以將它運行到很多系統的場景中。
ps: 在用了這種解決方案后確實不錯,系統的性能提升了很多,現在刷新頁面幾乎就和刷新靜態頁面的效果完全相同。
posted on 2005-10-18 17:35 BlueDavy 閱讀(1382) 評論(7) 編輯 收藏 所屬分類: Java