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

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

缓存管理类

 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. 【转】.NET程序员提高效率的70多个开发工具

    原文:.NET程序员提高效率的70多个开发工具 工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件 ...

  2. 基于stm32f427实现SVPWM控制永磁同步开环转动

    1.SVPWM原理简介 PWM(Pulse Width Modulation)脉宽调整,这是一种利用面积等效原理实现的控制技术.SVPWM(Space Vector PWM)空间矢量PWM控制,因为控 ...

  3. windows server 2016安装

    slmgr /skms kms.03k.org slmgr /ato slmgr /ipk WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY kms服务器: https://03k.org/ ...

  4. Mac使用Charles进行HTTPS抓包

    技术来源: PengYunjing 第一步 配置HTTP代理,这步与抓取HTTP请求是一样的: 选择在8888端口上监听,然后确定.够选了SOCKS proxy,还能截获到浏览器的http访问请求. ...

  5. Python 列表(list)的使用

    文章目录 一.创建list 二.访问list中元素 三.更新元素 四.删除元素 五.求list长度 六.连接列表 七.截取列表 八.复制列表 一.创建list myList = [2,3,1,5,6, ...

  6. pypi batch download

    https://wiki.archlinux.org/index.php/Python_package_guidelines_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87 ...

  7. c#串口测试

    软件和代码网盘下载 https://pan.baidu.com/s/1dFrE1pv#list/path=%2F SerialPort 类 https://msdn.microsoft.com/zh- ...

  8. 图解HTTP第六章

    HTTP 报文 1>HTTP 报文 2>HTTP 请求报文 在请求中,HTTP 报文由方法.URI.HTTP 版本.HTTP 首部字段.报文主体(不一定需要)等部分构成. 3>HTT ...

  9. Kmeanns图片压缩

    from sklearn.datasets import load_sample_image#先导入数据包 china = load_sample_image("china.jpg" ...

  10. 企业微信自建应用移动端动态获取li并给其事件问题总结

    前段时间一个项目增加企业微信移动端应用,其中几个小功能用到ul-li列表点击并获得相应数据: 开始用var lis=$('#ul li'); for(var=i;i<lis.length;i++ ...