Java缓存集合实现
转载请注明出处!
java 缓存集合 代码实现
废话不说,直接上代码,有注释,copy下来可以直接运行
/**
* author Jiane
*/
public class ExpriyMap<K,V> extends ConcurrentHashMap<K,V> implements Serializable{
private static final long serialVersionUID = 1L;
// default expiry time 2s
private long EXPIRY = 1000 * 5;
// 缓存key的到期时间集合
private volatile Map<K,Long> expriyMap = new ConcurrentHashMap();
// 缓存实例对象
private volatile static ExpiryMap<String,Object> SameUrlMap;
// 采用单例模式获取实例
public static ExpriyMap getInstance(){
// 第一次判空,提高效率
if(null == SameUrlMap){
// 保证效率
synchronized (ExpriyMap.class){
// 第二次判断空,保证单例对象的唯一性,防止一次有多个线程进入第一个if判断
if(null == SameUrlMap){
SameUrlMap = new ExpriyMap();
}
}
}
return SameUrlMap;
}
// expiryTime 有效期,毫秒
public V put(K key,V value , long expiryTime){
expriyMap.put(key,System.currentTimeMillis() + expiryTime);
return super.put(key,value);
}
@Override
public V put(K key,V value){
expriyMap.put(key,System.currentTimeMillis() + EXPIRY);
return super.put(key,value);
}
@Override
public boolean containsKey(Object key){
return !checkExpiry(key, true) && super.containsKey(key);
}
@Override
public boolean containsValue(Object value){
if(value == null){
return Boolean.FALSE;
}
Set<Entry<K,V>> set = super.entrySet();
Iterator<Entry<K,V>> iterator = set.iterator();
while(iterator.hasNext()){
Entry<K,V> entry = iterator.next();
if(value.equals(entry.getValue())){
if(checkExpiry(entry.getKey(),false)){
iterator.remove();
return Boolean.FALSE;
}else{
return Boolean.TRUE;
}
}
}
return Boolean.FALSE;
}
@Override
public V get(Object key){
if(key==null){
return null;
}
if(checkExpiry(key,true)){
return null;
}
return super.get(key);
}
// isRemoveSuper true super删除
// 是否过期
private boolean checkExpiry(Object key ,boolean isRemoveSuper){
if(!expriyMap.containsKey(key)){
return Boolean.FALSE;
}
long expriyTime = expriyMap.get(key);
boolean flag = System.currentTimeMillis() > expriyTime;
if(flag){
if(isRemoveSuper){
super.remove(key);
}
expriyMap.remove(key);
}
return flag;
}
}
简单写下使用方式
// ============================================================================
// 使用
private static final ExpriyMap<String,Object> expriyMap = ExpriyMap.getInstance();
// 调用, 缓存5分钟
expriyMap.put("key", value, 5 * 60 * 1000;
// 判断非空在强转
Object obj = expriyMap.get("key");
穷达皆由命,何劳发叹声。
但知行好事,莫要问前程。
冬去冰须泮,春来草自生。
请君观此理,天道甚分明。

浙公网安备 33010602011771号