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.测试结果

测试结果

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • oracle命令创建新用户

    oracle命令创建新用户一、sqlplus连接oracle1、sqlplus登录Windows需要sqlplus命令框,获取CMD窗口下输入sqlplus(需要先安装成功oracle)2、输入用户名和口令(密码)3、以sysdba身份连接oracleconnsys/密码assysdba4、查看当前查看当前实例名selectinstance_namefr…

  • 使用 HTML、CSS 和 JS 创建在线音乐播放器(含免费完整源码)

    使用 HTML、CSS 和 JS 创建在线音乐播放器(含免费完整源码)直接跳到末尾获取完整源码今天我将带着大家使用HTML、CSS和JS创建音乐播放器,没有使用任何其他库。我们的音乐播放器具有三个部分。主屏幕、播放器部分和播放列表部分。我们的主页部分有一个平滑的工作滑块,也有水平滚动。这个音乐播放器最好的部分是它最小化了音乐播放器。是的,您可以最小化和最大化播放器本身。使这个项目成为一个很棒的音乐播放器。❤️使用HTML、CSS和JS创建在线音乐播放器❤️????在线演示地址????完整代码结构????home-section首页部分???

  • pycharm如何设置快捷键「建议收藏」

    pycharm如何设置快捷键「建议收藏」pycharm中默认ctrl+d是复制一行,这和jupyter完全不一样,我比较喜欢的是:ctrl+d:删除一行ctrl+c:复制一行所以想要将pycharm进行修改。我们以ctrl+d:删除一行为例。找到如下:点击那一行。然后弹出如下对话框:我们不需要删除,直接按快捷键ctrl+d,自动更换为ctrl+d。此时会说和其他快捷键冲突了,没事,删除其他快捷键即可,那些都是一些不常用的。然后,我们可以删除以前的那个快捷键。完成…

  • Java调用第三方接口(http总结)

    Java调用第三方接口(http总结)业务需求:一般情况下都是后端提供接口,前端调用,解决需求,但是有的时候为了方便,复用别人的接口(网上的,公共的第三方接口(短信、天气等)),就出现了后端调用后端接口的情况。(类似JavaScript中的ajax一样获取数据,并对数据进行处理)对比一般情况:前端调用后端接口业务情况:后端调用后端接口几种方式总结:在Java项目中调用第三方接口的方式有:①通过JDK网络类Java….

  • [运算放大器系列]二、电压转4 – 20MA电流电路分析

    [运算放大器系列]二、电压转4 – 20MA电流电路分析[运算放大器系列]]二、电压转4-20MA电流电路分析偶然在网上看到一个4-20MA转换电路原理图如下:2.原理分析偶然在网上看到一个4-20MA转换电路原理图如下:2.原理分析RLR_LRL​为负载,分析电流流向如上图箭头所示可以得到假设Rloop上的压降为VlV_lVl​则:①Vi−V+R1=V+−(Vo−Vl)R2\frac{V_i-V_+}{R_1}=\frac{V_+-(V_o-V_l)}{R2}R1​Vi​−V+​​=R2V+​−(Vo​−Vl​)

  • vrrp协议的作用是实现什么的备份_vrrp优先级越大越优先吗

    vrrp协议的作用是实现什么的备份_vrrp优先级越大越优先吗一、VRRP的工作原理。二、VRRP的基本配置。三、VRRP的典型组网模型及并掌握配置方法。四、VRRP的常见问题及解决办法。一、VRRP的工作原理VRRP概述VirtualRouterRedundancyProtocol,也即虚拟路由器冗余协议。利用VRRP,一组路由器协同工作,但只有一个处于Master状态,处于该状态的路由器承担实际的数据流量转发任务。在一个VRRP组内的多个路由器接口共用一个虚拟IP地址,该地址被作为局域网内所有主机的缺省网关地址。VRRP决定哪个路由器是Ma

发表回复

您的电子邮箱地址不会被公开。

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