Java 中常用緩存Cache機制的實現

dfdfe 9年前發布 | 5K 次閱讀 Java 緩存

緩存主要可分為二大類:

一、通過文件緩存,顧名思義文件緩存是指把數據存儲在磁盤上,不管你是以XML格式,序列化文件DAT格式還是其它文件格式;

二、內存緩存,也就是實現一個類中靜態Map,對這個Map進行常規的增刪查.

代碼如下 :

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();

}   

} </pre>

 本文由用戶 dfdfe 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!