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;}}}

Java 缓存工具类 Cache相关推荐

  1. 缓存工具类MyCacheUtil

    MyCacheUtil.java package com.sunrise.jop.common.util;import java.io.File; import java.sql.Timestamp; ...

  2. Hutool Java常用工具类汇总

    简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的". Hu ...

  3. UrlUtils工具类,Java URL工具类,Java URL链接工具类

    UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>&g ...

  4. Java并发工具类(闭锁CountDownLatch)

    并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...

  5. java日期工具类DateUtil

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. DateUtil类 [java] view plain copy package com.util; ...

  6. Java常用工具类StringUtils的常用方法

    Java常用工具类StringUtils的常用方法 1.该工具类是用于操作Java.lang.String类的. 2.StringUtils类在操作字符串是安全的,不会报空指针异常,也正因此,在操作字 ...

  7. 组织机构代码和统一社会信用代码校验规则以及java校验工具类

    组织机构代码 编码规则编辑 1.全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码组成. 本体代码采用系列(即分区段)顺序编码方法. 校验码按照以下公式计算: C9 ...

  8. 彻底理解Java并发:Java并发工具类

    本篇内容包括:Java 并发工具类的介绍.使用方式与 Demo,包括了 CountDownLatch(线程计数器).CyclicBarrier(回环栅栏).Semaphore(信号量) 以及 Exch ...

  9. java 系统工具类 查询内存 CPU 系统基本信息 SysInfoUtils

    java 系统工具类 查询内存 CPU 系统基本信息 SysInfoUtils maven依赖 <dependency><groupId>com.github.oshi< ...

最新文章

  1. 录制短视频的录制按钮边框计时效果
  2. Python3 异步编程之进程与线程-1
  3. 深度linux12,Linux Deepin 12.06 试用体验
  4. vue2.0实现底部导航切换效果
  5. 使用Xftp连接树莓派并传输文件
  6. 数位dp:Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum
  7. 夏日炎炎 数据中心要降温更要注意湿度影响
  8. ExtClassLoader和AppClassLoader是Launcher类的两个内部类
  9. java reader 方法_Java Reader reset()方法
  10. 解决编译错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum
  11. Origin技巧:两个柱状图竖向重叠怎么办?
  12. 国际商务谈判 简答题
  13. 7-9 幂集(回溯法) (20 分)(C语言版)
  14. 万邦微信公众号根据关键词取文章列表 API 返回值说明
  15. 一些可以参考的文档集合4
  16. python用渐变色画圆_画圆圈和设置渐变色
  17. windows计算机图标历史,从1993年至今,Windows开始菜单的传奇发展史
  18. 2061:【例1.2】梯形面积
  19. 五年级信息技术上册教案计算机主机探秘,三年级信息技术第三课操作计算机教学设计...
  20. 架构 Varnish+Nginx+PHP(FastCGI)+MYSQL5+MemCache

热门文章

  1. TCP长连接,并行连接
  2. 软件公司良好制度积累
  3. c语言中dfs算法不定起点问题,dfs算法(dfs算法例子)
  4. C语言fseek函数了解
  5. C语言八进制转十进制(包括小数点)
  6. 热烈祝贺惠州学院翰墨缘书法协会第十三届书法作品展圆满成功!
  7. 实现应用软件能够通过运行窗口打开
  8. JS slice()方法返回数组中指定元素
  9. 字体加密破解技术分享-01
  10. python程序中长下划线怎么打_python中下划线怎么输入