Java简单实现本地缓存
注意:此代码不适合集群部署环境
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 简单实现缓存服务
*
* @author moumou
* @date 2022/8/9 14:12
*/
public class Cache {
/**
* 有效时间30分钟:30 * 60 * 1000
*/
private static final long CACHE_HOLD_TIME_30M = 1800000L;
/**
* 有效时间key后缀
*/
private static final String SECONDS = "_seconds";
private static volatile Cache cache;
private static Map<String, Object> CACHE_MAP;
private Cache() {
CACHE_MAP = new ConcurrentHashMap<>();
}
public static Cache getInstance() {
if (cache == null) {
synchronized (Cache.class) {
if (cache == null) {
cache = new Cache();
}
}
}
return cache;
}
/**
* 存放一个缓存对象,默认保存时间30分钟
*
* @param cacheName 缓存名称
* @param obj 缓存对象
*/
public void put(String cacheName, Object obj) {
put(cacheName, obj, CACHE_HOLD_TIME_30M);
}
/**
* 存放一个缓存对象,保存时间为holdTime
*
* @param cacheName 缓存名称
* @param obj 缓存对象
* @param seconds 时间
*/
public void put(String cacheName, Object obj, long seconds) {
CACHE_MAP.put(cacheName, obj);
// 设置缓存失效时间
CACHE_MAP.put(cacheName + SECONDS,
System.currentTimeMillis() + seconds);
}
/**
* 取出一个缓存对象
*
* @param cacheName 缓存名称
* @return 缓存对象
*/
public Object get(String cacheName) {
if (checkCacheName(cacheName)) {
return CACHE_MAP.get(cacheName);
}
return null;
}
/**
* 删除某个缓存
*
* @param cacheName 缓存名称
*/
public void remove(String cacheName) {
CACHE_MAP.remove(cacheName);
CACHE_MAP.remove(cacheName + SECONDS);
}
/**
* 检查缓存对象是否存在,
* 若不存在,则返回false
* 若存在,检查其是否已过有效期,如果已经过了则删除该缓存并返回false
*
* @param cacheName 缓存名称
* @return 缓存对象是否存在
*/
public boolean checkCacheName(String cacheName) {
Long seconds = (Long) CACHE_MAP.get(cacheName + SECONDS);
if (seconds == null || seconds == 0L) {
return false;
}
if (seconds < System.currentTimeMillis()) {
remove(cacheName);
return false;
}
return true;
}
}