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");

posted @ 2021-04-22 15:08  Jiane```  阅读(254)  评论(0)    收藏  举报
……