Java中常用缓存Cache机制的实现

jopen 10年前

所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。

Java中常用缓存Cache机制的实现

缓存主要可分为二大类:

一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;

二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查.

代码如下 :

package lhm.hcy.guge.frameset.cache;     import java.util.*;      //Description: 管理缓存      //可扩展的功能:当chche到内存溢出时必须清除掉最早期的一些缓存对象,这就要求对每个缓存对象保存创建时间     public class CacheManager {       private static HashMap cacheMap = new HashMap();         //单实例构造方法       private CacheManager() {           super();       }       //获取布尔值的缓存       public static boolean getSimpleFlag(String key){           try{               return (Boolean) cacheMap.get(key);           }catch(NullPointerException e){               return false;           }       }       public static long getServerStartdt(String key){           try {               return (Long)cacheMap.get(key);           } catch (Exception ex) {               return 0;           }       }       //设置布尔值的缓存       public synchronized static boolean setSimpleFlag(String key,boolean flag){           if (flag && getSimpleFlag(key)) {//假如为真不允许被覆盖               return false;           }else{               cacheMap.put(key, flag);               return true;           }       }       public synchronized static boolean setSimpleFlag(String key,long serverbegrundt){           if (cacheMap.get(key) == null) {               cacheMap.put(key,serverbegrundt);               return true;           }else{               return false;           }       }         //得到缓存。同步静态方法       private synchronized static Cache getCache(String key) {           return (Cache) cacheMap.get(key);       }         //判断是否存在一个缓存       private synchronized static boolean hasCache(String key) {           return cacheMap.containsKey(key);       }         //清除所有缓存       public synchronized static void clearAll() {           cacheMap.clear();       }         //清除某一类特定缓存,通过遍历HASHMAP下的所有对象,来判断它的KEY与传入的TYPE是否匹配       public synchronized static void clearAll(String type) {           Iterator i = cacheMap.entrySet().iterator();           String key;           ArrayList arr = new ArrayList();           try {               while (i.hasNext()) {                   java.util.Map.Entry entry = (java.util.Map.Entry) i.next();                   key = (String) entry.getKey();                   if (key.startsWith(type)) { //如果匹配则删除掉                       arr.add(key);                   }               }               for (int k = 0; k < arr.size(); k++) {                   clearOnly(arr.get(k));               }           } catch (Exception ex) {               ex.printStackTrace();           }       }         //清除指定的缓存       public synchronized static void clearOnly(String key) {           cacheMap.remove(key);       }         //载入缓存       public synchronized static void putCache(String key, Cache obj) {           cacheMap.put(key, obj);       }         //获取缓存信息       public static Cache getCacheInfo(String key) {             if (hasCache(key)) {               Cache cache = getCache(key);               if (cacheExpired(cache)) { //调用判断是否终止方法                   cache.setExpired(true);               }               return cache;           }else               return null;       }         //载入缓存信息       public static void putCacheInfo(String key, Cache obj, long dt,boolean expired) {           Cache cache = new Cache();           cache.setKey(key);           cache.setTimeOut(dt + System.currentTimeMillis()); //设置多久后更新缓存           cache.setValue(obj);           cache.setExpired(expired); //缓存默认载入时,终止状态为FALSE           cacheMap.put(key, cache);       }       //重写载入缓存信息方法       public static void putCacheInfo(String key,Cache obj,long dt){           Cache cache = new Cache();           cache.setKey(key);           cache.setTimeOut(dt+System.currentTimeMillis());           cache.setValue(obj);           cache.setExpired(false);           cacheMap.put(key,cache);       }         //判断缓存是否终止       public static boolean cacheExpired(Cache cache) {           if (null == cache) { //传入的缓存不存在               return false;           }           long nowDt = System.currentTimeMillis(); //系统当前的毫秒数           long cacheDt = cache.getTimeOut(); //缓存内的过期毫秒数           if (cacheDt <= 0||cacheDt>nowDt) { //过期时间小于等于零时,或者过期时间大于当前时间时,则为FALSE               return false;           } else { //大于过期时间 即过期               return true;           }       }         //获取缓存中的大小       public static int getCacheSize() {           return cacheMap.size();       }         //获取指定的类型的大小       public static int getCacheSize(String type) {           int k = 0;           Iterator i = cacheMap.entrySet().iterator();           String key;           try {               while (i.hasNext()) {                   java.util.Map.Entry entry = (java.util.Map.Entry) i.next();                   key = (String) entry.getKey();                   if (key.indexOf(type) != -1) { //如果匹配则删除掉                       k++;                   }               }           } catch (Exception ex) {               ex.printStackTrace();           }             return k;       }         //获取缓存对象中的所有键值名称       public static ArrayList getCacheAllkey() {           ArrayList a = new ArrayList();           try {               Iterator i = cacheMap.entrySet().iterator();               while (i.hasNext()) {                   java.util.Map.Entry entry = (java.util.Map.Entry) i.next();                   a.add((String) entry.getKey());               }           } catch (Exception ex) {} finally {               return a;           }       }         //获取缓存对象中指定类型 的键值名称       public static ArrayList getCacheListkey(String type) {           ArrayList a = new ArrayList();           String key;           try {               Iterator i = cacheMap.entrySet().iterator();               while (i.hasNext()) {                   java.util.Map.Entry entry = (java.util.Map.Entry) i.next();                   key = (String) entry.getKey();                   if (key.indexOf(type) != -1) {                       a.add(key);                   }               }           } catch (Exception ex) {} finally {               return a;           }       }     }     package lhm.hcy.guge.frameset.cache;     public class Cache {           private String key;//缓存ID           private Object value;//缓存数据           private long timeOut;//更新时间           private boolean expired; //是否终止           public Cache() {                   super();           }             public Cache(String key, Object value, long timeOut, boolean expired) {                   this.key = key;                   this.value = value;                   this.timeOut = timeOut;                   this.expired = expired;           }             public String getKey() {                   return key;           }             public long getTimeOut() {                   return timeOut;           }             public Object getValue() {                   return value;           }             public void setKey(String string) {                   key = string;           }             public void setTimeOut(long l) {                   timeOut = l;           }             public void setValue(Object object) {                   value = object;           }             public boolean isExpired() {                   return expired;           }             public void setExpired(boolean b) {                   expired = b;           }   }     //测试类,   class Test {       public static void main(String[] args) {           System.out.println(CacheManager.getSimpleFlag("alksd"));   //        CacheManager.putCache("abc", new Cache());   //        CacheManager.putCache("def", new Cache());   //        CacheManager.putCache("ccc", new Cache());   //        CacheManager.clearOnly("");   //        Cache c = new Cache();   //        for (int i = 0; i < 10; i++) {   //            CacheManager.putCache("" + i, c);   //        }   //        CacheManager.putCache("aaaaaaaa", c);   //        CacheManager.putCache("abchcy;alskd", c);   //        CacheManager.putCache("cccccccc", c);   //        CacheManager.putCache("abcoqiwhcy", c);   //        System.out.println("删除前的大小:"+CacheManager.getCacheSize());   //        CacheManager.getCacheAllkey();   //        CacheManager.clearAll("aaaa");   //        System.out.println("删除后的大小:"+CacheManager.getCacheSize());   //        CacheManager.getCacheAllkey();         }   }
来源:安度博客