以下代码参考于网上,做了小部分修改。

该代码实现了定时清除临时缓存的功能。

缓存管理类

 package com.wbproject.util.cache;

 import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; /**
* 缓存管理类
*
* @author wangbo
* @date 2018-03-07 12:43:41
*/
public class CacheManage { private static Map<Object, Object> cacheMap = new HashMap<>(); private static Map<Object, CacheConfModel> cacheConfMap = new HashMap<>(); private static CacheManage cm = null; // 构造方法私有化
private CacheManage() {
} // 获取实例
public static CacheManage getInstance() {
if (cm == null) {
cm = new CacheManage();
// 第一次获取实例的时候启动线程
Thread t = new ClearCache();
t.start();
}
return cm;
} /**
* 添加缓存实体
*
* @param key
* @param value
* @param ccm
* @return
*/
public boolean addCache(Object key, Object value, CacheConfModel ccm) {
System.out.println("开始增加缓存");
boolean flag = false;
try {
cacheMap.put(key, value);
cacheConfMap.put(key, ccm);
System.out.println("增加缓存结束");
flag = true;
} catch (Exception e) {
e.printStackTrace();
} return flag;
} /**
* 获取缓存实体
*
* @param key
* @return
*/
public Object getValue(Object key) {
Object object = cacheMap.get(key);
if (object != null) {
return object;
} else {
return null;
}
} /**
* 获取缓存数据的数量
*
* @return
*/
public int getSize() {
return cacheMap.size();
} /**
* 删除缓存
*
* @param key
* @return
*/
public boolean removeCache(Object key) {
boolean flag = false;
try {
cacheMap.remove(key);
cacheConfMap.remove(key);
flag = true;
} catch (Exception e) {
e.printStackTrace();
}
return flag;
} /**
* 清除缓存的线程
*/
private static class ClearCache extends Thread {
public void run() {
while (true) {
// 记录要清除的key
Set<Object> tempSet = new HashSet<>();
Set<Object> set = cacheConfMap.keySet();
Iterator<Object> it = set.iterator();
while (it.hasNext()) {
Object key = it.next();
CacheConfModel ccm = (CacheConfModel) cacheConfMap.get(key);
// 比较是否需要清除
if (!ccm.isForever()) {
if ((new Date().getTime() - ccm.getBeginTime()) >= ccm.getDurableTime() * 1000L) {
// 可以清除,先记录下来
tempSet.add(key);
}
}
}
// 真正清除
Iterator<Object> tempIt = tempSet.iterator();
while (tempIt.hasNext()) {
Object key = tempIt.next();
cacheMap.remove(key);
cacheConfMap.remove(key);
} LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("当前时间为:" + localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + ",缓存大小==>" + cacheMap.size());
// 线程休息
try {
Thread.sleep(60 * 10 * 1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} }

缓存配置实体类

 package com.wbproject.util.cache;

 /**
* 缓存配置实体类
*
* @author wangbo
* @date 2018-03-07 12:42:56
*/
public class CacheConfModel implements java.io.Serializable { private static final long serialVersionUID = 1L; private long beginTime;// 缓存开始时间 private int durableTime;// 持续时间,秒 private boolean isForever = false;// 是否持久 public long getBeginTime() {
return beginTime;
} public void setBeginTime(long beginTime) {
this.beginTime = beginTime;
} public boolean isForever() {
return isForever;
} public void setForever(boolean isForever) {
this.isForever = isForever;
} public int getDurableTime() {
return durableTime;
} public void setDurableTime(int durableTime) {
this.durableTime = durableTime;
} }

最后贴上操作缓存的工具类,简单写了几个用到的,如果没有可自行添加:

 package com.wbproject.util.cache;

 import java.util.Date;

 /**
* 操作缓存的工具类
*
* @author wangbo
* @date 2018-03-07 13:01:54
*/
public class CacheUtil { /**
* 添加缓存
*
* @param key
* @param value
*/
public static boolean addCache(Object key, Object value) {
CacheManage cm = CacheManage.getInstance();
CacheConfModel cModel = new CacheConfModel();
cModel.setForever(true);
return cm.addCache(key, value, cModel);
} /**
* 添加临时缓存
*
* @param key
* @param value
* @param durableTime
*/
public static boolean addTempCache(Object key, Object value, int durableTime) {
CacheManage cm = CacheManage.getInstance();
CacheConfModel cModel = new CacheConfModel();
cModel.setBeginTime(new Date().getTime());
cModel.setDurableTime(durableTime);
cModel.setForever(false);
return cm.addCache(key, value, cModel);
} /**
* 获取缓存
*
* @param key
* @return
*/
public static Object getValue(Object key) {
CacheManage cm = CacheManage.getInstance();
Object ob = cm.getValue(key);
if (ob == null) {
return null;
}
return ob;
} /**
* 获取字符串缓存
*
* @param key
* @return
*/
public static String getStringValue(Object key) {
CacheManage cm = CacheManage.getInstance();
Object ob = cm.getValue(key);
if (ob == null) {
return null;
}
return ob.toString();
} }

Java 使用 Map 实现缓存工具的更多相关文章

  1. java使用Map做缓存你真的用对了吗?弱引用WeakHashMap了解一下

    目录 关于缓存我们应该考虑什么?-intsmaze WeakHashMap弱引用-intsmaze 线程安全问题-intsmaze Collections-intsmaze ThreadLocal-i ...

  2. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  3. Java 使用Redis缓存工具的图文详细方法

    开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. (1)Java的安装配置可以参考我们的 Java ...

  4. 五、jdk工具之jmap(java memory map)、 mat之四--结合mat对内存泄露的分析、jhat之二--结合jmap生成的dump结果在浏览器上展示

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  5. Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable

    Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable接口,泛型 Collection,List,Se ...

  6. 基于java反射的javabean和map相互转换的工具类

    话不多说,代码如下 package com.study; import java.lang.reflect.Field; import java.util.HashMap; import java.u ...

  7. Java基础学习总结(54)——JSON和Map转换的工具类

    在pom.xml文件中引入如下jar <dependency> <groupId>commons-lang</groupId> <artifactId> ...

  8. Java | Map排序,工具类改进

    package util; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; ...

  9. redis缓存工具类

    import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis ...

随机推荐

  1. Kubernetes节点维护

    1.设置节点为不可调度 kubectl cordon $NODENAME 2.使用kubectl drain优雅的结束节点上的所有 pod 并同时标记节点为不可调度 kubectl drain $NO ...

  2. centos-1 nginx

    常用命令 su #切换用户mkdir flodr #创建目录rm -r flodr #删除文件/目录,有提示rm -rf flodr #删除文件/目录,无提示pwd #查看当前路径  防火墙设置 ht ...

  3. Golang:接口(interface)

    Go中没有class的概念.Go 语言中使用组合实现对象特性的描述.对象的内部使用结构体内嵌组合对象应该具有的特性,对外通过接口暴露能使用的特性.Go 语言的接口设计是非侵入式的,接口不知道接口被哪些 ...

  4. 团队Scrum冲刺阶段-Day 6

    选择困难症的福音--团队Scrum冲刺阶段-Day 6 今日进展 编写提问部分 游戏分类的界面全部写完了!!!! 临时大家决定没有BGM的app不是一个完整的app,所以在大家共同学习的努力下,听完四 ...

  5. playframework 一步一步来 之 日志 (三)

    在paly中自定义配置logback,也很简单,只需在conf folder下添一个application-logger.xml或者logger.xml就行了.(出处:"If you cre ...

  6. 返回上一页 html A标记代码

    <a class="sjad" href="#" onClick="javascript:history.back(-1);"> ...

  7. [Ionic] Error: No provider for Http! Error: No provider for Http!

    1. 打开src/app/app.module.ts 2. 在最上面导入 import{HttpModule} from '@angular/http'; 3. 在imports块中加入:HttpMo ...

  8. 将地图定位封装为ng指令

    一.HTML结构<div tabindex="-1" class="modal fade in active modal-map" role=" ...

  9. mysql5.7高版本加载低版本sql文件,时间不能为0000-00-00格式错误

    错误代码:ERROR 1067 (42000): Invalid default value for 解决方式 1. show session variables like '%sql_mode%'; ...

  10. Java:ConcurrentHashMap是弱一致的

    本文将用到Java内存模型的happens-before偏序关系(下文将简称为hb)以及ConcurrentHashMap的底层模型相关的知识.happens-before相关内容参见:JLS §17 ...