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

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

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

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

(0)


相关推荐

  • Java SSM练手小项目-手把手带你搭建一个基于SSM框架的人力资源管理后台系统

    Java SSM练手小项目-手把手带你搭建一个基于SSM框架的人力资源管理后台系统前言相信很多小伙伴在学习完SSM三大架构以后,不知道该如何找到一个简单容易上手的项目进行实战训练,经常在博客上看到一个不错的项目下载下来以后全部都是代码,无处下手。因此本文力求以最简单易懂的项目结构和代码搭建一个还较为完整(即从登录到退出的整个流程)的后台系统。(适合新手)整个项目的操作流程动态图如下(由于CSDN对上传图片大小有限制,这里录制的gif画面很不清晰,点击图片查看更清晰):…

  • Codeforces 235B Let&#39;s Play Osu! 概率dp(水

    Codeforces 235B Let&#39;s Play Osu! 概率dp(水

  • JS ajax 例子「建议收藏」

    JS ajax 例子「建议收藏」用js,jQuery编写ajax的样式,三种写法,例子://用js原生写法functionsendGet(url){xhr.onreadystatechange=function(){ if(xhr.readyState==4&&xhr.status==200){ //获取服务器响应 document…

  • ov7725 stm32_如何给实验培养皿拍照

    ov7725 stm32_如何给实验培养皿拍照平台:STM32ZET6(核心板)+ST-LINK/V2+SD卡+USB串口线+鹰眼OV7725摄像头(注意,为了减少摄像头连线的麻烦,建议初学者选取单片机时选用带有摄像头接口的板子)工程介绍:需要移植FatFs文件系统,同时需要了解BMP位图的存储数据结构,从而实现将摄像头输出的RGB565像素数据直接输出到sd卡上,保存为*.bmp文件。1.BMP位图的存储1.1 数据结构介绍//BMP头文…

  • 香农编码的 matlab 实现「建议收藏」

    香农编码的 matlab 实现「建议收藏」closeall;clearall;clc;%香农编码matlab实现p=[0.50.190.190.070.05]%输入概率n=length(p);y=fliplr(sort(p));D=zeros(n,4);D(:,1)=y’;fori=2:nD(1,2)=0;D(i,2)=D(i-1,1)+D(i-1,2)…

  • 使用MySQL Workbench建立数据库,建立新的表,向表中添加数据

    使用MySQL Workbench建立数据库,建立新的表,向表中添加数据初学数据库,记录一下所学的知识。我用的MySQL数据库,使用MySQLWorkbench管理。下面简单介绍一下如何使用MySQLWorkbench建立数据库,建立新的表,为表添加数据。  点击上图中的“加号”图标,新建一个连接,    如上图,先输入数据库的账号密码,帐号默认为root,填好密码后点击“OK”,连接就建立好了,建立完成后,会出现一个长方

发表回复

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

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