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

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

缓存管理类

 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. bootstrap table dataView展开行详情,p元素自动换行

    // bootstrap table 行详情展开,p元素自动换行1 .tableClass .detail-view p{ white-space: normal; }

  2. python 微信轰炸

    from __future__ import unicode_literals import requests import itchat import time def get_news(): ur ...

  3. h5页面转图片长按保存

    5页面经常会遇到此类需求.将最后的结果页转换为图片长按保存.下面介绍一下实现此需求的过程 1,依赖安装 cnpm install html2canvas --save 2,依赖引入,使用 绑定 初始化 ...

  4. 计数排序之python

    话说,一口气不能吃个胖子, 一次性 学习 计数排序, 也确实容易消化不良. 下面,我们逐步学习下计数排序. 1.  已知一个简单列表 l1 = [5, 4, 3], 分析下这个列表的情况 5 > ...

  5. Numpy 创建数组

    ndarray 数组除了可以使用底层 ndarray 构造器来创建外, 也可以通过以下几种方式来创建. numpy.empty numpy.empty 方法用来创建一个指定形状(shape),数据类型 ...

  6. 摹客iDoc 新功能“柔性工作流”,让设计随需而动

    摹客iDoc推出了全新“柔性工作流”,让协作设计自由流动,随需而动. 更高效.更自由的协作方式,赶快告诉你的团队吧~ “柔性工作流” VS “普通工作流” 普通工作流往往是将很多东西混杂在一起,并施以 ...

  7. CentOS 7 设置默认进入图形界面或文本界面

    [root@rems2 ~]# systemctl get-default graphical.target [root@rems2 ~]# systemctl set-default multi-u ...

  8. NPOI颜色对照表

    颜色对照表:颜色 测试 Class名称 short        Test颜色 Black 8 Test颜色 Brown 60 Test颜色 Olive_Green 59 Test颜色 Dark_Gr ...

  9. 4月23日 db 命令操作 和表操作

    1内容回顾: # 补充的知识点 # server端肯定是确定下来的 # mysql的客户端 # mysql.exe 直接在命令行就可以运行的 (学习阶段用) # navicat等可视化的客户端,是第三 ...

  10. 85、int 、NSInteger、NSUInteger、NSNumber的区别和联系

    NSNumber是NSValue的一个子类,它是一个对象来存储数字值包括bool型,它提供了一系列的方法来存储char a signed or unsigned char, short int, in ...