可定制生命周期的緩存

          1) ICache.java 緩存接口

          package com.jgao.cache;

          /**
           * 緩存接口
           * 
          @author jgao
           *
           
          */

          public interface ICache {
              
              
          public static int Forever = -1//緩存中對象生命周期的結束標志

              
          /**
               * 判斷緩存中的對象是否存在
               * 
          @param key
               * 
          @return
               
          */

              
          boolean contains(String key);
              
              
          /**
               * 獲取緩存中的對象
               * 
          @param key 對象名稱
               * 
          @return
               
          */

              Object get(String key);

              
          /**
               * 向緩存中插入對象
               * 
          @param key 對象名稱
               * 
          @param obj 對象
               * 
          @param slidingExpiration 對象在緩存中存在的時間
               
          */

              
          void Insert(String key, Object obj, int slidingExpiration);

              
          /**
               * 
               * 向緩存中添加對象,并返回該對象
               * 
          @param key 對象名稱
               * 
          @param obj 對象
               * 
          @param slidingExpiration 對象在緩存中存在的時間
               * 
          @return
               
          */

              Object Add(String key, Object obj, 
          int slidingExpiration);
              
              
          /**
               * 移除緩存中的對象
               * 
          @param key 對象名稱
               * 
          @return
               
          */

              Object Remove(String key);
          }

          2) DefaultCache.java 默認緩存
          package com.jgao.cache;

          import java.util.*;

          /**
           * 系統默認的緩存
           * 
          @author jgao
           *
           
          */

          class DefaultCache implements ICache {

              
          static int FreshTimerIntervalSeconds = 1//緩存中對象生命周期的頻率(一秒)
              Map<String, SimpleCacheInfo> datas; //緩存容器
              private Timer timer; //時間任務
              
              
          /**
               * 默認構造函數
               *
               
          */

              
          public DefaultCache() {
                  
          //實例化有防止線程同步操作的緩存容器
                  datas = Collections.synchronizedMap(new HashMap<String, SimpleCacheInfo>());
                  
                  
          //刷新緩存
                  TimerTask task = new CacheFreshTask(this);
                  timer 
          = new Timer("SimpleCache_Timer"true);
                  timer.scheduleAtFixedRate(task, 
          1000, FreshTimerIntervalSeconds * 1000);//每格一秒刷新一次(緩存中對象的生命周期減一)
              }


              
          /**
               * 判斷緩存中的對象是否存在
               * 
          @param key
               * 
          @return
               
          */

              
          public boolean contains(String key){
                  
          return datas.containsKey(key);
              }

              
              
          /**
               * 獲取緩存中的對象
               * 
          @param key 對象名稱
               * 
          @return
               
          */

              
          public Object get(String key) {
                  
          if (datas.containsKey(key)) {
                      SimpleCacheInfo sci 
          = (SimpleCacheInfo)datas.get(key);
                      
          //sci.setSecondsRemain(sci.getSecondsTotal());
                      return sci.getObj();
                  }

                  
          return null;
              }

              
              
          /**
               * 向緩存中插入對象
               * 
          @param key 對象名稱
               * 
          @param obj 對象
               * 
          @param cacheSeconds 對象在緩存中存在的時間
               
          */

              
          public void Insert(String key, Object obj, int cacheSeconds) {
                  Add(key, obj, cacheSeconds);
              }

              
              
          /**
               * 
               * 向緩存中添加對象,并返回該對象
               * 
          @param key 對象名稱
               * 
          @param obj 對象
               * 
          @param cacheSeconds 對象在緩存中存在的時間
               * 
          @return
               
          */

              
          public Object Add(String key, Object obj, int cacheSeconds) {
                  
          if (cacheSeconds != 0{
                      SimpleCacheInfo sci 
          = new SimpleCacheInfo(obj, cacheSeconds);
                      datas.put(key, sci);
                  }

                  
          return obj;
              }

              
              
          /**
               * 移除緩存中的對象
               * 
          @param key 對象名稱
               * 
          @return
               
          */

              
          public Object Remove(String key) {
                  SimpleCacheInfo sci 
          = datas.remove(key);
                  
          if (sci != null{
                      
          return sci.getObj();
                  }

                  
          return null;
              }

              
              
          /**
               * 緩存信息類(存儲緩存中的對象和緩存時間)
               * 
          @author jgao
               *
               
          */

              
          class SimpleCacheInfo {
                  
          private Object obj;
                  
          private int secondsRemain;
                  
          private int cacheSeconds;
                  
                  
          public SimpleCacheInfo(Object obj, int cacheSeconds) {
                      
          this.obj = obj;
                      
          this.secondsRemain = cacheSeconds;
                      
          this.cacheSeconds = cacheSeconds;
                  }

                  
                  
          public Object getObj() {
                      
          return obj;
                  }


                  
          int getSecondsTotal() {
                      
          return cacheSeconds;
                  }

                  
                  
          int getSecondsRemain() {
                      
          return secondsRemain;
                  }

                  
                  
          void setSecondsRemain(int value) {
                      secondsRemain 
          = value;
                  }

              }

              
              
          /**
               * 管理緩存中對象的生命周期的任務類(用于定時刷新緩存中的對象)
               * 
          @author jgao
               *
               
          */

              
          class CacheFreshTask extends TimerTask {
                  
          private DefaultCache cache;
                  
          public CacheFreshTask(DefaultCache cache) {
                      
          this.cache = cache;
                  }


                  
          public void run() {
                      
          synchronized (cache.datas) {
                          Iterator
          <Map.Entry<String, SimpleCacheInfo>> iterator
                              
          = cache.datas.entrySet().iterator();
                          
          while (iterator.hasNext()) {
                              Map.Entry
          <String, SimpleCacheInfo> entry = iterator.next();
                              SimpleCacheInfo sci 
          = entry.getValue();
                              
          if (sci.getSecondsTotal() != ICache.Forever) {
                                  sci.setSecondsRemain(sci.getSecondsRemain() 
          - FreshTimerIntervalSeconds);
                                  
          if (sci.getSecondsRemain() <= 0{
                                      iterator.remove();
                                  }

                              }

                          }

                      }

                  }

              }

          }


          3) CacheFactory.java 緩存工廠
          package com.jgao.cache;

          /**
           * 緩存工廠,用于獲取和制造緩存
           * 
          @author jgao
           *
           
          */

          public class CacheFactory {

              
          private static ICache cache = null;
              
              
          /**
               * 獲取caches指定的緩存
               * 
          @param caches
               * 
          @return 
               
          */

              
          public static ICache getCacheInstance(Class caches){
                  
          if(cache==null){
                      
          try {
                          cache 
          = (ICache) caches.newInstance();
                      }
           catch (InstantiationException e) {
                          System.out.println(
          "指定的緩存類有誤,caches參數必須是ICache的實現類");
                          e.printStackTrace();
                      }
           catch (IllegalAccessException e) {
                          System.out.println(
          "指定的緩存類有誤,caches參數必須是ICache的實現類");
                          e.printStackTrace();
                      }

                  }

                  
          return cache;
              }

              
              
          /**
               * 獲取系統默認的緩存
               * 
          @return
               
          */

              
          public static ICache getDefaultCache(){
                  
          if(cache==null){
                      cache 
          = new DefaultCache();
                  }
          else if(!(cache instanceof DefaultCache)){
                      cache 
          = new DefaultCache();
                  }

                  
          return cache;
              }

              
              
          public static void main(String[] args) {
                  ICache cache 
          = CacheFactory.getDefaultCache();
                  
          if(cache.contains("area")){
                      System.out.println(cache.get(
          "area"));
                  }
          else{
                      cache.Insert(
          "area","福州",120);
                  }

                  
              }

          }

          posted on 2007-04-22 06:18 JGAO編程隨筆 閱讀(1010) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 哈尔滨市| 称多县| 弥渡县| 唐山市| 德保县| 灵宝市| 成安县| 甘肃省| 永吉县| 大新县| 清苑县| 分宜县| 怀安县| 怀远县| 湾仔区| 辽阳市| 长沙市| 阳山县| 彝良县| 安西县| 旬阳县| 景洪市| 禹城市| 泗水县| 龙海市| 尤溪县| 余姚市| 长岛县| 五台县| 策勒县| 西充县| 响水县| 白沙| 光山县| 西丰县| 鄂州市| 汤原县| 丰都县| 栾城县| 安福县| 盐边县|