首頁 Java java教程 Java 中常用快取Cache機制的實現

Java 中常用快取Cache機制的實現

Nov 10, 2016 am 11:08 AM

快取主要可分為二大類:

一、透過檔案快取,顧名思義檔案快取是指把資料儲存在磁碟上,不管你是以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();   
    
    }   
}
登入後複製


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

2025年的前4個JavaScript框架:React,Angular,Vue,Svelte 2025年的前4個JavaScript框架:React,Angular,Vue,Svelte Mar 07, 2025 pm 06:09 PM

2025年的前4個JavaScript框架:React,Angular,Vue,Svelte

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存? 如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存? Mar 17, 2025 pm 05:44 PM

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?

Node.js 20:關鍵性能提升和新功能 Node.js 20:關鍵性能提升和新功能 Mar 07, 2025 pm 06:12 PM

Node.js 20:關鍵性能提升和新功能

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Mar 17, 2025 pm 05:35 PM

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?

冰山:數據湖桌的未來 冰山:數據湖桌的未來 Mar 07, 2025 pm 06:31 PM

冰山:數據湖桌的未來

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復 Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復 Mar 07, 2025 pm 05:52 PM

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? 如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? Mar 17, 2025 pm 05:43 PM

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? 如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? Mar 17, 2025 pm 05:46 PM

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?

See all articles