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 CACHE_DATA = new ConcurrentHashMap(); 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 { 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 getData(String key, Load 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 getData(String key) { CacheData data = CACHE_DATA.get(key); if (data != null && (data.getExpire() <= 0 || data.getSaveTime() >= new Date().getTime())) { return data.getData(); } return null; } public 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 load(); } }