java 缓存工具类初始化_Java缓存框架

java 缓存工具类初始化_Java缓存框架Java缓存工具类Cache工具类定义

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

Jetbrains全系列IDE稳定放心使用

Java 缓存工具类 Cache

工具类定义

package com.demo.utils;

import org.springframework.util.StringUtils;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/** * Description: 缓存工具类 * 1.部分方法未验证,如有问题请自行修改 * 2.其他方法请自行添加 * * @Author: zhx & moon hongxu_1234@163.com * @Date: 2022-04-07 20:54 * @version: V1.0.0 */
public class Cache { 
   

    /** * 屏蔽工具类的无参构造 避免工具类被实例化 */
    private Cache(){ 
   }

    /** * 缓存留存期 30min 1H 24H */
    public static final long CACHE_HOLD_TIME_30M = 30 * 60 * 1000L;
    public static final long CACHE_HOLD_TIME_1H = 2 * CACHE_HOLD_TIME_30M;
    public static final long CACHE_HOLD_TIME_24H = 24 * CACHE_HOLD_TIME_1H;
    public static final long CACHE_HOLD_TIME_FOREVER = -1L;

    /** * 缓存容量、最少使用容量 */
    private static final int CACHE_MAX_CAP = 1000;
    private static final int CLEAN_LRU_CAP = 800;

    /** * 缓存当前大小 */
    private static AtomicInteger CACHE_CURRENT_SIZE = new AtomicInteger(0);

    /** * 缓存对象 */
    private static final Map<String,Node> CACHE_MAP = new ConcurrentHashMap<>(CACHE_MAX_CAP);

    /** * 最少使用记录 */
    private static final List<String> LRU_LIST = new LinkedList<>();

    /** * 自动清理标志位 */
    private static volatile boolean CLEAN_RUN_FLAG = false;

    /** * 默认30MIN * @param key * @param val */
    public static void put(String key,Object val){ 
   
        put(key,val,CACHE_HOLD_TIME_30M);
    }

    /** * 添加永久缓存 * @param key * @param val */
    public static void putForever(String key,Object val){ 
   
        put(key,val,CACHE_HOLD_TIME_FOREVER);
    }

    /** * 添加缓存 * @param key * @param val * @param ttlTime */
    public static void put(String key,Object val,long ttlTime){ 
   
        if (!StringUtils.hasLength(key) || null == val){ 
   
            return;
        }
        checkSize();
        updateCacheLru(key);
        CACHE_MAP.put(key,new Node(val,ttlTime));
    }

    /** * 获取缓存信息 * @param key * @param clazz * @param <T> * @return */
    public static <T> T get(String key,Class<T> clazz){ 
   
        if (!StringUtils.hasLength(key) || !CACHE_MAP.containsKey(key)){ 
   
            return null;
        }
        updateCacheLru(key);
        return (T) CACHE_MAP.get(key).getVal();
    }

    /** * 更新最近使用位置 * @param key */
    private static void updateCacheLru(String key){ 
   
        synchronized (LRU_LIST){ 
   
            LRU_LIST.remove(key);
            LRU_LIST.add(0,key);
        }
    }

    /** * 删除,成功则容量-1 * @param key */
    private static boolean remove(String key){ 
   
        Node node = CACHE_MAP.remove(key);
        if (null!=node){ 
   
            CACHE_CURRENT_SIZE.getAndDecrement();
            return true;
        }
        return false;
    }

    /** * 检查是否超过容量,先清理过期,在清理最少使用 */
    private static void checkSize(){ 
   
        if (CACHE_CURRENT_SIZE.intValue() > CACHE_MAX_CAP){ 
   
            deleteTimeOut();
        }
        if (CACHE_CURRENT_SIZE.intValue() > CLEAN_LRU_CAP){ 
   
            deleteLru();
        }
    }

    /** * 删除最久未使用,尾部删除 * 永久缓存不会被清除 */
    private static void deleteLru(){ 
   
        synchronized (LRU_LIST){ 
   
            while (LRU_LIST.size() > CLEAN_LRU_CAP){ 
   
                int lastIndex = LRU_LIST.size() - 1;
                String key = LRU_LIST.get(lastIndex);
                if (!CACHE_MAP.get(key).isForever() && remove(key)){ 
   
                    LRU_LIST.remove(lastIndex);
                }
            }
        }
    }

    /** * 删除过期 */
    private static void deleteTimeOut(){ 
   
        List<String> del = new LinkedList<>();
        for (Map.Entry<String,Node> entry:CACHE_MAP.entrySet()){ 
   
            if (entry.getValue().isExpired()){ 
   
                del.add(entry.getKey());
            }
        }
        for (String k:del){ 
   
            remove(k);
        }
    }

    /** * 缓存是否已存在,过期则删除返回False * @param key * @return */
    public static boolean contains(String key){ 
   
        if (CACHE_MAP.containsKey(key)){ 
   
            if (!CACHE_MAP.get(key).isExpired()){ 
   
                return true;
            }
            if (remove(key)){ 
   
                return false;
            }
            return true;
        }
        return false;
    }

    /** * 清空缓存 */
    public static void clear(){ 
   
        CACHE_MAP.clear();
        CACHE_CURRENT_SIZE.set(0);
        LRU_LIST.clear();
    }

    /** * 重置自动清理标志 * @param flag */
    public static void setCleanRunFlag(boolean flag){ 
   
        CLEAN_RUN_FLAG = flag;
    }

    /** * 自动清理过期缓存 */
    private static void startAutoClean(){ 
   

        if (!CLEAN_RUN_FLAG){ 
   
            setCleanRunFlag(true);
            ScheduledExecutorService scheduledExecutor = new ScheduledThreadPoolExecutor(1);
            scheduledExecutor.scheduleAtFixedRate(()->{ 
   
                try { 
   
                    Cache.setCleanRunFlag(true);
                    while (CLEAN_RUN_FLAG){ 
   
                        Cache.deleteTimeOut();
                    }
                } catch (Exception e) { 
   
                    e.printStackTrace();
                }
            },10,Cache.CACHE_HOLD_TIME_1H, TimeUnit.SECONDS);
        }
    }

    /** * 缓存对象类 */
    public static class Node{ 
   
        /** * 缓存值 */
        private Object val;
        /** * 过期时间 */
        private long ttlTime;

        public Node(Object val,long ttlTime){ 
   
            this.val = val;
            if (ttlTime<0){ 
   
                this.ttlTime = ttlTime;
            }else{ 
   
                this.ttlTime = System.currentTimeMillis() + ttlTime;
            }
        }

        public Object getVal(){ 
   
            return this.val;
        }

        public boolean isExpired(){ 
   
            if (this.ttlTime<0){ 
   
                return false;
            }
            return System.currentTimeMillis() > this.ttlTime;
        }

        public boolean isForever(){ 
   
            if (this.ttlTime<0){ 
   
                return true;
            }
            return false;
        }

    }


}

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

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

(0)
上一篇 2022年10月4日 下午3:16
下一篇 2022年10月4日 下午3:16


相关推荐

  • 嵌入式开发之mipi协议基础学习

    嵌入式开发之mipi协议基础学习MIPI——Mobileindustryprocessinterface多家移动开发或者应用商共同筹划接口标准联盟节约成本,加快产品开发速度内容丰富,显示、照相机、电源管理、射频、存储接口等等CIS(cmosimagesensor)中仅用到了mipi协议中的csi-2(cameraserialinterface二代,标识生成要求)和D-phy

    2022年5月24日
    40
  • 易语言时间戳转时间

    易语言时间戳转时间其实就是一行代码的事 返回类似于 2018 年 8 月 1 日几点几分几秒增减时间 到时间 1970 01 0100 00 00 秒 时间戳

    2026年3月17日
    2
  • 技术串讲 CAS 有用

    技术串讲 CAS 有用

    2021年6月10日
    115
  • [日常] Go语言圣经-匿名函数习题

    [日常] Go语言圣经-匿名函数习题

    2021年5月26日
    98
  • 给在读研究生&未来要读研同学们的一封受益匪浅的信

    给在读研究生&未来要读研同学们的一封受益匪浅的信读研首先要改变的是自己的心理状态,说起来简单,但实际上很困难。不过既然已经上了研,就不要抱怨了,努力想想自己该干啥才是王道。首先需要明确几种好的心态。(仅以此文使自己进步,时时规范自己的行为。谦虚使人进步,骄傲使人落后。)当你上课感觉就像打酱油时,当你对研究生很迷茫时,当你坐在电脑前孜孜不倦时,请看下面的文章,很受用,至少我心里现在没有以前浮躁。好的文章有时能改变一个人的精神状态,下面就是…

    2022年5月15日
    37
  • Gradle系列:深入了解Gradle和Maven的区别

    Gradle系列:深入了解Gradle和Maven的区别文章目录前言简介 gradle 和 maven 的比较可扩展性性能比较增量构建构建缓存 Gradle 守护进程依赖的区别从 maven 迁移到 gradle 先看下怎么引入这三个 plugin 自动转换转换依赖转换 repositories 仓库控制依赖的版本多模块项目 profile 和属性资源处理前言文章转载于 程序那些事原作者微信公众号 程序那些事原文地址 深入了解 gradle 和 maven 的区别简介 Gradle 和 Maven 都可以用来构建 Java 程序 甚至在某些情况下 两者还可以互相转换 那么他们

    2026年3月17日
    1

发表回复

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

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