Java 使用 Map 实现缓存工具
以下代码参考于网上,做了小部分修改。
该代码实现了定时清除临时缓存的功能。
缓存管理类
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 实现缓存工具的更多相关文章
- java使用Map做缓存你真的用对了吗?弱引用WeakHashMap了解一下
目录 关于缓存我们应该考虑什么?-intsmaze WeakHashMap弱引用-intsmaze 线程安全问题-intsmaze Collections-intsmaze ThreadLocal-i ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- Java 使用Redis缓存工具的图文详细方法
开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. (1)Java的安装配置可以参考我们的 Java ...
- 五、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 ...
- Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable
Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable接口,泛型 Collection,List,Se ...
- 基于java反射的javabean和map相互转换的工具类
话不多说,代码如下 package com.study; import java.lang.reflect.Field; import java.util.HashMap; import java.u ...
- Java基础学习总结(54)——JSON和Map转换的工具类
在pom.xml文件中引入如下jar <dependency> <groupId>commons-lang</groupId> <artifactId> ...
- Java | Map排序,工具类改进
package util; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; ...
- redis缓存工具类
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis ...
随机推荐
- View操作 swift
//创建View let view1 =UIView() let view2 =UIView(frame: CGRectMake(,, ,)) let view3 =UIView(frame: CGR ...
- HTML5-盒子的使用
一. border-color border-width border-style 属性用法遵循顺时针顺序. border-top- border-left- border-bottom- borde ...
- Codeforces 1083C Max Mex
Description 一棵\(N\)个节点的树, 每个节点上都有 互不相同的 \([0, ~N-1]\) 的数. 定义一条路径上的数的集合为 \(S\), 求一条路径使得 \(Mex(S)\) 最大 ...
- 洛谷P1576||最小花费||dijkstra||双向建边!!
题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. 数据范 ...
- 设计模式学习心得<享元模式 Flyweight>
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ...
- 【机器学习】K均值算法(I)
K均值算法是一类非监督学习类,其可以通过观察样本的离散性来对样本进行分类. 例如,在对如下图所示的样本中进行聚类,则执行如下步骤 1:随机选取3个点作为聚类中心. 2:簇分配:遍历所有样本然后依据每个 ...
- 关于python,完善我计算机知识的一步。
因为身为理科男,所以特别喜欢涉及其他领域的知识.而对我来说,计算机是很有诱惑力的--尤其是程序语言设计,懂得一门“外语”是多么的重要.大一时候接触过包括有计算机的基本知识,c语言,这个新的学期也开始接 ...
- 基于STM32L4的开源NBIOT开发资料
基于STM32L4的开源NBIOT开发资料 1. 参考路径:http://www.stmcu.org/module/forum/forum.php?mod=viewthread&tid=615 ...
- Combo控件失效
问题:点击combo控件,下拉选项不显示. 解决:注释HandleMessage中的MessageHandler相关语句,正常下拉.
- python3 爬取搜狗微信的文章
目标地址:http://weixin.sogou.com/weixin? 这个地址是搜狗微信的文章搜索,可以搜索到微信的文章,而我们目标就是这些文章内容 这个url经过测试,当我们没登陆微信只能看到1 ...