关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Java中常用缓存Cache机制的实现

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

    2014-11-04 00:00:00 出处:techug
    分享

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

    缓存主要可分为二大类:

    一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以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(); 
    
        } 
    }
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。