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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SNMP 协议[通俗易懂]

    SNMP 协议[通俗易懂]一、SNMP协议概述简单网络管理协议(SNMP:SimpleNetworkManagementProtocol)是由互联网工程任务组(IETF:InternetEngineeringTaskForce)定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP:SimpleGatewayMonitorProtocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。虽然SNMP开始是面向基于IP的网络管理

    2022年10月17日
    2
  • maven本地仓库配置文件_maven默认仓库地址

    maven本地仓库配置文件_maven默认仓库地址maven配置本地仓库

    2022年9月23日
    4
  • 终端terminal个性化配置[通俗易懂]

    终端terminal个性化配置[通俗易懂]http://blog.csdn.net/pipisorry/article/details/39584489{本文介绍linux终端字体颜色设置、终端提示符显示内容设置、自定义alias命令}linux打开终端快捷键:ctrl+alt+t新窗口中打开ctrl+shift+t新标签页中打开个人配置文件介绍系统默认状态下的终端显示为紫底白字(皮皮的…

    2022年7月13日
    14
  • VS2013 产品密钥 – 所有版本-亲试,好使!!

    VS2013 产品密钥 – 所有版本-亲试,好使!!VisualStudioUltimate2013KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9VisualStudioPremium2013KEY(密钥):FBJVC-3CMTX-D8DVP-RTQCT-92494VisualStudioProfessional2013KEY(密钥):XDM3T-W3T3V-MGJWK-8B…

    2022年5月19日
    747
  • 2011年全国电子设计大赛综合测试题_全国大学生英语竞赛 C类

    2011年全国电子设计大赛综合测试题_全国大学生英语竞赛 C类系统方案总体设计方案本系统主要由电位器模块、直流减速电机模块、电源模块、电机驱动模块、单片机最小系统班组成。电位器与主控芯片STM32F407ZGT6相连,通过电位的测算实时向MCU发送摆杆的状态,MCU通过控制LM298N电机驱动模块来控制直流减速电机,进而控制摆杆的状态,并使用LCD显示相关参数。方案的比较与选择2.1传感器的选择方案一:采用三轴陀螺仪测量摆杆的偏转角度。当选用三轴陀螺仪检测摆杆的偏转角度时,虽然可以计算摆杆的偏转角度,但是传感器必须要固定在摆杆上,同时需与M…

    2022年8月18日
    6
  • python3.7安装pycrypto

    python3.7安装pycrypto首先直接打开 cmd 注意不是打开 python 也不用切换到 python 命令行直接输入 pip3installp 我这里安装过了 所以提示我已经安装过 如果未安装则提示安装成功然后找到你的 python 包的安装目录 也就是上面我们提示的 c users 杨 appdata local programs python python37 lib sit

    2025年6月16日
    3

发表回复

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

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