系統級信息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

          評論

          # re: 系統級信息Cache的實現 2005-10-18 21:51 Vinson

          I don't think the jsp cache tag is a good solution to improve the performance. It will cause the maintainbility problem.

          For an example, one drop down list may be shared among more than one pages. If the cache policy need to be changed, then all the page need to be changed.


          Generally speaking, the drop down list is retrieved from database , and the web tier invokes some interface to get the data.

          If interceptor (AOP) is applied to the interface , while the interceptor may cache data, then the cahe is transparent to the web as well to the biz tier. All the code related to the cache such as cache provider, cache policy.. is centrialized in the interceptor.  回復  更多評論   

          # re: 系統級信息Cache的實現 2005-10-19 09:23 lizongbo

          //one drop down list may be shared among more than one pages

          oscache的cache是可以指定scope的,application,session,request隨便選擇。
            回復  更多評論   

          # re: 系統級信息Cache的實現 2005-10-19 09:56 Vinson

          The cache policy may comprise update policy, cache provider, enviction policy. it is not only the scope.  回復  更多評論   

          # re: 系統級信息Cache的實現 2005-10-19 11:44 Programmer's Life

          Many thanks to Vinson,I think that system cache can be divided into two side,one is backend data cache,the other is page cache or block cache.
          Block cache just from the other view to solute the cache problem,i think the problem what u say can be soluted by oscache's key or the other view solution(such as decorator).  回復  更多評論   

          # re: 系統級信息Cache的實現 2005-11-22 09:02 xuefeng

          對于一個mvc結構的web應用,jsp的cache僅僅能cache jsp處理的一段代碼,但是,對設計良好的應用來說,jsp僅僅是渲染結果,這個速度是非常快的,而在controller中執行的復雜操作如數據庫查詢速度是很慢的,只有cache這部分結果,才能真正提高速度。

          因此我覺得jsp cache tag幾乎沒有什么用,除非把數據庫操作的代碼放在中間,只有在controller中直接用oscache才可能cache操作費時的結果如數據庫查詢結果。  回復  更多評論   

          # re: 系統級信息Cache的實現 2005-11-22 09:17 Programmer's Life

          ... 是的,這個其實也是在MVC框架實現中的一個問題,呵呵,按照MVC來說,所有的頁面顯示都只是純的顯示而已,這個時候cache要做的話確實就象你說的一樣,要在入口處做cache,這樣才能起到效果。  回復  更多評論   

          # re: 系統級信息Cache的實現 2005-12-09 22:33 Xuefeng

          一個辦法是在Controller中使用模版方法,把返回的Model緩存起來:

          class TemplateController {

          protected abstract String getKey();
          protected abstract Model getModel(args);

          public final handle(args) {
          Model model = getFromCache(getKey);
          if(model==null) {
          model = getModel();
          putCache(model);
          }
          return model;
          }
          }


            回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

          <2005年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 灌云县| 岐山县| 温州市| 衡东县| 吐鲁番市| 江孜县| 南阳市| 虹口区| 瓮安县| 保定市| 扶风县| 绥江县| 旅游| 睢宁县| 莱州市| 黄梅县| 松滋市| 桃江县| 遂宁市| 许昌市| 乌兰察布市| 灵武市| 黄大仙区| 江孜县| 启东市| 扶绥县| 泾阳县| 奉节县| 澳门| 壶关县| 呼和浩特市| 宝清县| 大关县| 论坛| 沂南县| 璧山县| 昌宁县| 红河县| 平度市| 大英县| 大渡口区|