package com.terra.proxy.controller;
|
|
import java.util.Date;
|
import java.util.Map;
|
import java.util.concurrent.ConcurrentHashMap;
|
|
/**
|
* 简单对象缓存管理
|
* Created by lxb on 2018/7/1
|
*/
|
public class CacheManager {
|
|
private static final long DEFAULT_TIMEOUT = 30000;
|
private long cacheTimeout;
|
private static CacheManager defaultInstance;
|
private static Map<String, CacheData> CACHE_DATA = new ConcurrentHashMap<String, CacheData>();
|
|
|
private CacheManager(long timeout) {
|
|
this.cacheTimeout = timeout;
|
|
new ClearThread().start();
|
|
}
|
|
private class ClearThread extends Thread {
|
ClearThread() {
|
setName("clear cache thread");
|
}
|
|
public void run() {
|
while (true) {
|
try {
|
long now = System.currentTimeMillis();
|
Object[] keys = CACHE_DATA.keySet().toArray();
|
for (Object key : keys) {
|
CacheData data = CACHE_DATA.get(key);
|
if (data != null && (data.getExpire() > 0 && data.getSaveTime() < new Date().getTime())) {
|
synchronized (CACHE_DATA) {
|
CACHE_DATA.remove(key);
|
}
|
}
|
}
|
|
Thread.sleep(cacheTimeout);
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
}
|
|
public static synchronized final CacheManager getDefault() {
|
if (defaultInstance == null) {
|
defaultInstance = new CacheManager(DEFAULT_TIMEOUT);
|
}
|
return defaultInstance;
|
|
}
|
|
private class CacheData<T> {
|
CacheData(T t, int expire) {
|
this.data = t;
|
this.expire = expire <= 0 ? 0 : expire * 1000;
|
this.saveTime = new Date().getTime() + this.expire;
|
}
|
|
private T data;
|
private long saveTime; // 存活时间
|
private long expire; // 过期时间 小于等于0标识永久存活
|
|
public T getData() {
|
return data;
|
}
|
|
public long getExpire() {
|
return expire;
|
}
|
|
public long getSaveTime() {
|
return saveTime;
|
}
|
}
|
|
|
public <T> T getData(String key, Load<T> load, int expire) {
|
T data = getData(key);
|
if (data == null && load != null) {
|
data = load.load();
|
if (data != null) {
|
setData(key, data, expire);
|
}
|
}
|
return data;
|
}
|
|
public <T> T getData(String key) {
|
CacheData<T> data = CACHE_DATA.get(key);
|
if (data != null && (data.getExpire() <= 0 || data.getSaveTime() >= new Date().getTime())) {
|
return data.getData();
|
}
|
return null;
|
}
|
|
public <T> void setData(String key, T data, int expire) {
|
CACHE_DATA.put(key, new CacheData(data, expire));
|
}
|
|
public void clear(String key) {
|
CACHE_DATA.remove(key);
|
}
|
|
public void clearAll() {
|
CACHE_DATA.clear();
|
}
|
|
public interface Load<T> {
|
T load();
|
}
|
|
}
|