Java缓存及过期处理的简单实现「建议收藏」

Java缓存及过期处理的简单实现「建议收藏」/***缓存类实体类*/publicclassCacheEntity<T>{/***要存储的数据*/privateTvalue;/***创建的时间单位ms*/privatelongcreateTime=System.currentTimeMillis();…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1. 创建缓存实体类

保存需要缓存的数据,缓存创建的时间和缓存的有效期

/** * 缓存类实体类 */
public class CacheEntity<T> { 
   

    /** * 要存储的数据 */
    private T value;

    /** * 创建的时间 单位ms */
    private long createTime = System.currentTimeMillis();

    /** * 缓存的有效时间 单位ms (小于等于0表示永久保存) */
    private long cacheTime;

    public CacheEntity() { 
   
        super();
    }

    public CacheEntity(T value, long cacheTime) { 
   
        this.value = value;
        this.cacheTime = cacheTime;
    }

    public T getValue() { 
   
        return value;
    }

    public void setValue(T value) { 
   
        this.value = value;
    }

    public long getCreateTime() { 
   
        return createTime;
    }

    public void setCreateTime(long createTime) { 
   
        this.createTime = createTime;
    }

    public long getCacheTime() { 
   
        return cacheTime;
    }

    public void setCacheTime(long cacheTime) { 
   
        this.cacheTime = cacheTime;
    }
}

2. 缓存的管理类

主要用户管理缓存数据,对数据的添加,删除。对缓存数据有效性校验,其中创建了一个Timer定时任务,每分钟执行一次缓存清理。

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
/** * 缓存管理器 */
public class CacheManager { 
   

    /** * 缓存Map对象 */
    private static ConcurrentHashMap<String,CacheEntity> cacheMap = new ConcurrentHashMap<>();

    /** * 创建定时任务每分钟清理一次缓存 */
    static{ 
   
        Timer timer = new Timer();
        timer.schedule(new TimerTask() { 
   
            @Override
            public void run() { 
   
                refresh();
            }
        },0,60000);
    }

    /** * 缓存刷新,清除过期数据 */
    public static void refresh(){ 
   
        for (String key : cacheMap.keySet()) { 
   
            if(isExpire(key)){ 
   
                remove(key);
            }
        }
    }

    /** * 加入缓存 * @param key * @param value */
    public static boolean put(String key,Object value){ 
   
        if(key.isEmpty()){ 
   
            return false;
        }
        CacheEntity<Object> cacheEntity = new CacheEntity<>();
        cacheEntity.setCacheTime(0);
        cacheEntity.setValue(value);
        cacheMap.put(key,cacheEntity);
        return true;
    }

    /** * 加入缓存,包含过期时间 * @param key 缓存数据的关键字 * @param value 缓存数据 * @param cacheTime 要缓存的时间 * @param timeUnit 时间单位 */
    public static boolean put(String key, Object value,long cacheTime,TimeUnit timeUnit){ 
   
        if(key.isEmpty()){ 
   
            return false;
        }
        CacheEntity<Object> cacheEntity = new CacheEntity<>();
        cacheEntity.setCacheTime(timeUnit.toMillis(cacheTime));
        cacheEntity.setValue(value);
        cacheMap.put(key,cacheEntity);
        return true;
    }

    /** * 移除缓存数据 * @param key */
    public static boolean remove(String key){ 
   
        if(key.isEmpty()){ 
   
            return false;
        }
        if(!cacheMap.containsKey(key)){ 
   
            return true;
        }
        cacheMap.remove(key);
        return true;
    }

    /** * 获取缓存数据 * @param key * @return */
    public static Object get(String key){ 
   
        if(key.isEmpty()||isExpire(key)){ 
   
            return null;
        }
        CacheEntity cacheEntity = cacheMap.get(key);
        if(null == cacheEntity){ 
   
            return null;
        }
        return cacheEntity.getValue();
    }

    /** * 判断当前数据是否已过期 * @param key * @return */
    private static boolean isExpire(String key){ 
   
        if(key.isEmpty()){ 
   
            return false;
        }
        if(cacheMap.containsKey(key)){ 
   
            CacheEntity cacheEntity = cacheMap.get(key);
            long createTime = cacheEntity.getCreateTime();
            long currentTime = System.currentTimeMillis();
            long cacheTime = cacheEntity.getCacheTime();
            if(cacheTime>0&&currentTime-createTime>cacheTime){ 
   
                return true;
            }
            return false;
        }
        return false;
    }

    /** * 获取当前缓存大小(包含已过期但未清理的数据) * @return */
    public static int getCacheSize(){ 
   
        return cacheMap.size();
    }
}

3. 缓存的测试类

验证缓存对数据的存储,提取及对数据有效性的验证。

import java.util.concurrent.TimeUnit;
/** * 测试类 */
public class Main { 
   

    public static void main(String[] args) throws InterruptedException { 
   

		// try { 
   
		// Class.forName(CacheManager.class.getName());
		// } catch (ClassNotFoundException e) { 
   
		// e.printStackTrace();
		// }

        CacheManager.put("one","第一个数据");
        CacheManager.put("two","第二条数据",50, TimeUnit.SECONDS);
        CacheManager.put("three","第三条数据",3,TimeUnit.MINUTES);

        System.out.println("立刻获取------------------------");
        System.out.println(CacheManager.get("one"));
        System.out.println(CacheManager.get("two"));
        System.out.println(CacheManager.get("three"));

        Thread.sleep(55000);
        System.out.println("55秒后------------------------");
        System.out.println(CacheManager.get("one"));
        System.out.println(CacheManager.get("two"));
        System.out.println(CacheManager.get("three"));

        Thread.sleep(60000-55000);
        System.out.println("1分钟后------------------------");
        System.out.println(CacheManager.get("one"));
        System.out.println(CacheManager.get("two"));
        System.out.println(CacheManager.get("three"));

        Thread.sleep(120000-60000);
        System.out.println("2分钟后------------------------");
        System.out.println(CacheManager.get("one"));
        System.out.println(CacheManager.get("two"));
        System.out.println(CacheManager.get("three"));

        Thread.sleep(180000-120000);
        System.out.println("3分钟时------------------------");
        System.out.println(CacheManager.get("one"));
        System.out.println(CacheManager.get("two"));
        System.out.println(CacheManager.get("three"));

        Thread.sleep(190000-180000);
        System.out.println("3分钟10秒后------------------------");
        System.out.println(CacheManager.get("one"));
        System.out.println(CacheManager.get("two"));
        System.out.println(CacheManager.get("three"));

        System.out.println("缓存的大小: "+CacheManager.getCacheSize());

        System.out.println("main over------------------------");

    }
}

4.测试结果

测试结果

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189097.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux 小知识翻译 – 「/proc 文件夹」

    Linux 小知识翻译 – 「/proc 文件夹」

    2021年8月30日
    66
  • PHP获取客户端IP地址方式[通俗易懂]

    PHP获取客户端IP地址方式[通俗易懂]一、如果没有使用代理服务器REMOTE_ADDR=客户端IPHTTP_X_FORWARDED_FOR=没数值或不显示$ip=$_SERVER[‘REMOTE_ADDR’];二、使用透明代理REMOTE_ADDR=最后一个代理服务器IPHTTP_X_FORWARDED_FOR=客户端真实IP(经过多个代理服务器时,这个值类似:221.5.252….

    2025年7月21日
    1
  • 什么叫买单报关_代理报关和买单报关费用是一样的吗

    什么叫买单报关_代理报关和买单报关费用是一样的吗报关是指货物、行李和邮递物品、运输工具等在进出关境或国境时由所有人或其代理人向海关申报,交验规定的单据、证件,请求海关办理进出口的有关手续。我国海关规定报关时应交纳的单据、证件。有:进出口货物报关单、进出口货物许可证、商品检验证书、动植物检疫证书、食品卫生检验证书以及提货单、装货单、运单、发票、装箱单等。买单出口,其实就是没有出口权的工厂或SOHO通过买别的进出口公司的核销单,以该公司的名义进行外贸出口。买单出口所买的“单”主要是指核销单,但是卖单出口服务的公司除了提供核销单之外还需要提供与核销单抬头一

    2022年9月21日
    0
  • java课程设计-多人聊天工具(socket+多线程)

    大一下学期的java期末课程设计,分享一下文章目录课设要求相关知识点类图项目框架核心代码1.服务器端Server.java课设要求多人聊天工具服务器要求1:能够看到所有在线用户(25%)服务器要求2:能够强制用户下线(25%)客户端要求1:能够看到所有在线用户(25%)客户端要求2:能够向某个用户发送消息(25%)相关知识点1.服务端能够看到所有在线用户服务端继承了JFrame,实现可视化,通过socket实现服务端与客户端的连接,服务端每接收一个连接,把传进来的用户名和对应的s.

    2022年4月7日
    58
  • 脑科学磁共振成像(MRI)初学者必看——功能脑网络、小世界网络、FDR校正、脑电信号频率变换、模板、假设检验、广义线性模型、独立成分分析、影像组学、任务态和静息态方法汇总「建议收藏」

    脑科学磁共振成像(MRI)初学者必看——功能脑网络、小世界网络、FDR校正、脑电信号频率变换、模板、假设检验、广义线性模型、独立成分分析、影像组学、任务态和静息态方法汇总「建议收藏」磁共振成像初学者必看一、浅谈功能脑网络二、不同模态脑网络的构建功能脑网络结构脑网络白质纤维束脑网络加权网络二值网络三、趣谈散点图与相关系数四、脑电信号频域变换五、fMRI中的FDR校正六、模板(mask)1、模板(mask)往往是与ROI联系在一起的2、mask作用的原理3、常见的mask七、假设检验和效果量八、组水平标准化九、由ALFF说开去十、计算机存取MRI影像的那些事十二、Linux基础命令十三、浅谈标准空间模板和空间变换一:标准空间模板二:空间变换十四、功能连接十五、大脑激活与功能连接的

    2022年7月24日
    48
  • jdk卸载错误

    jdk卸载错误错误提示:已经安装了这个版本提示是否卸载;   在开始运行中输入regedit打开注册表,定位到HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall错误提示:无法使用此产品的安装源。请确认安装源存在,并且您可以访问它。   优化大师和360也无法卸载,删注册表HKEY_LOCAL_MAC

    2022年6月15日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号