主要是针对单机应用下的缓存设计:
缓存实体类:
package com.whty.transform.common.cache;
/**
* Created by Administrator on 2018/10/15 0015.
*/
public class EntityCache {
/**
* 保存的数据
*/
private Object datas;
/**
* 设置数据失效时间,为0表示永不失效,过期时间单位s
*/
private long timeOut;
/**
* 最后刷新时间
*/
private long lastRefeshTime;
public EntityCache(Object datas, long timeOut, long lastRefeshTime) {
this.datas = datas;
this.timeOut = timeOut;
this.lastRefeshTime = lastRefeshTime;
}
public Object getDatas() {
return datas;
}
public void setDatas(Object datas) {
this.datas = datas;
}
public long getTimeOut() {
return timeOut;
}
public void setTimeOut(long timeOut) {
this.timeOut = timeOut;
}
public long getLastRefeshTime() {
return lastRefeshTime;
}
public void setLastRefeshTime(long lastRefeshTime) {
this.lastRefeshTime = lastRefeshTime;
}
}
说明:
datas:存放缓存的数据
timeOut:设置该缓存是否过期
lastRefeshTime:缓存存放的时间,默认是系统当前时间,后面跑监听销毁使用
缓存接口:
package com.whty.transform.common.cache;
import java.util.Map;
import java.util.Set;
/**
* Created by Administrator on 2018/10/15 0015.
*/
public interface ICacheManager {
/**
* 存入缓存
* @param key
* @param cache
*/
void putCache(String key, EntityCache cache);
/**
* 存入缓存
* @param key
* @param datas
*/
void putCache(String key, Object datas, long timeOut);
/**
* 获取对应缓存
* @param key
* @return
*/
EntityCache getCacheByKey(String key);
/**
* 获取对应缓存
* @param key
* @return
*/
Object getCacheDataByKey(String key);
/**
* 获取所有缓存
* @return
*/
Map<String, EntityCache> getCacheAll();
/**
* 判断是否在缓存中
* @param key
* @return
*/
boolean isContains(String key);
/**
* 清除所有缓存
*/
void clearAll();
/**
* 清除对应缓存
* @param key
*/
void clearByKey(String key);
/**
* 缓存是否超时失效
* @param key
* @return
*/
boolean isTimeOut(String key);
/**
* 获取所有key
* @return
*/
Set<String> getAllKeys();
}
缓存接口实现类:
package com.whty.transform.common.cache;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by Administrator on 2018/10/15 0015.
*/
public class CacheManagerImpl implements ICacheManager {
private static Map<String, EntityCache> caches = new ConcurrentHashMap<String, EntityCache>();
private static CacheManagerImpl instance = null;
private CacheManagerImpl() {}
public static synchronized CacheManagerImpl getInstance(){
if(instance == null){
instance = new CacheManagerImpl();
}
return instance;
}
/**
* 存入缓存
* @param key
* @param cache
*/
public void putCache(String key, EntityCache cache) {
caches.put(key, cache);
}
/**
* 存入缓存
* @param key
* @param datas
*/
public void putCache(String key, Object datas, long timeOut) {
timeOut = timeOut > 0 ? timeOut : 0L;
putCache(key, new EntityCache(datas, timeOut, System.currentTimeMillis()));
}
/**
* 获取对应缓存
* @param key
* @return
*/
public EntityCache getCacheByKey(String key) {
if (this.isContains(key)) {
return caches.get(key);
}
return null;
}
/**
* 获取对应缓存
* @param key
* @return
*/
public Object getCacheDataByKey(String key) {
if (this.isContains(key)) {
return caches.get(key).getDatas();
}
return null;
}
/**
* 获取所有缓存
* @return
*/
public Map<String, EntityCache> getCacheAll() {
return caches;
}
/**
* 判断是否在缓存中
* @param key
* @return
*/
public boolean isContains(String key) {
return caches.containsKey(key);
}
/**
* 清除所有缓存
*/
public void clearAll() {
caches.clear();
}
/**
* 清除对应缓存
* @param key
*/
public void clearByKey(String key) {
if (this.isContains(key)) {
caches.remove(key);
}
}
/**
* 缓存是否超时失效
* @param key
* @return
*/
public boolean isTimeOut(String key) {
if (!caches.containsKey(key)) {
return true;
}
EntityCache cache = caches.get(key);
long timeOut = cache.getTimeOut();
long lastRefreshTime = cache.getLastRefeshTime();
if (timeOut != 0 && System.currentTimeMillis() - lastRefreshTime >= timeOut) {
return true;
}
return false;
}
/**
* 获取所有key
* @return
*/
public Set<String> getAllKeys() {
return caches.keySet();
}
}
说明:使用单例模式设计获取实例。
缓存监听类:
package com.whty.transform.web.listener;
import com.whty.transform.common.cache.CacheManagerImpl;
/**
* Created by Administrator on 2018/10/15 0015.
*/
public class CacheListener {
private CacheManagerImpl cacheManagerImpl;
public CacheListener(CacheManagerImpl cacheManagerImpl) {
this.cacheManagerImpl = cacheManagerImpl;
}
public void startListen() {
new Thread() {
public void run() {
while (true) {
for (String key : cacheManagerImpl.getAllKeys()) {
if (cacheManagerImpl.isTimeOut(key)) {
cacheManagerImpl.clearByKey(key);
}
}
}
}
}.start();
}
}
实时清空缓存过期的对象,注意:该监听在javaee的servlerContext上下文监听下触发比较好。
测试:
CacheManagerImpl.getInstance().putCache(CommonConstants.TRANSFORM_IP_ADDRESS, ipAdds.substring(0,ipAdds.length() - 1), 0);
可以自行测试,结束!感谢开源!