content: package com.xxl.job.admin.core.util;
  
  import java.util.concurrent.ConcurrentHashMap;
  import java.util.concurrent.ConcurrentMap;
  
  /**
   * local cache tool
   *
   * @author xuxueli 2018-01-22 21:37:34
   */
  public class LocalCacheUtil {
  
  	private static ConcurrentMap<String, LocalCacheData> cacheRepository = new ConcurrentHashMap<String, LocalCacheData>(); // 类型建议用抽象父类，兼容性更好；
  
  	private static class LocalCacheData {
  
  		private String key;
  
  		private Object val;
  
  		private long timeoutTime;
  
  		public LocalCacheData() {
  		}
  
  		public LocalCacheData(String key, Object val, long timeoutTime) {
  			this.key = key;
  			this.val = val;
  			this.timeoutTime = timeoutTime;
  		}
  
  		public String getKey() {
  			return key;
  		}
  
  		public void setKey(String key) {
  			this.key = key;
  		}
  
  		public Object getVal() {
  			return val;
  		}
  
  		public void setVal(Object val) {
  			this.val = val;
  		}
  
  		public long getTimeoutTime() {
  			return timeoutTime;
  		}
  
  		public void setTimeoutTime(long timeoutTime) {
  			this.timeoutTime = timeoutTime;
  		}
  
  	}
  
  	/**
  	 * set cache
  	 * @param key
  	 * @param val
  	 * @param cacheTime
  	 * @return
  	 */
  	public static boolean set(String key, Object val, long cacheTime) {
  
  		// clean timeout cache, before set new cache (avoid cache too much)
  		cleanTimeoutCache();
  
  		// set new cache
  		if (key == null || key.trim().length() == 0) {
  			return false;
  		}
  		if (val == null) {
  			remove(key);
  		}
  		if (cacheTime <= 0) {
  			remove(key);
  		}
  		long timeoutTime = System.currentTimeMillis() + cacheTime;
  		LocalCacheData localCacheData = new LocalCacheData(key, val, timeoutTime);
  		cacheRepository.put(localCacheData.getKey(), localCacheData);
  		return true;
  	}
  
  	/**
  	 * remove cache
  	 * @param key
  	 * @return
  	 */
  	public static boolean remove(String key) {
  		if (key == null || key.trim().length() == 0) {
  			return false;
  		}
  		cacheRepository.remove(key);
  		return true;
  	}
  
  	/**
  	 * get cache
  	 * @param key
  	 * @return
  	 */
  	public static Object get(String key) {
  		if (key == null || key.trim().length() == 0) {
  			return null;
  		}
  		LocalCacheData localCacheData = cacheRepository.get(key);
  		if (localCacheData != null && System.currentTimeMillis() < localCacheData.getTimeoutTime()) {
  			return localCacheData.getVal();
  		}
  		else {
  			remove(key);
  			return null;
  		}
  	}
  
  	/**
  	 * clean timeout cache
  	 * @return
  	 */
  	public static boolean cleanTimeoutCache() {
  		if (!cacheRepository.keySet().isEmpty()) {
  			for (String key : cacheRepository.keySet()) {
  				LocalCacheData localCacheData = cacheRepository.get(key);
  				if (localCacheData != null && System.currentTimeMillis() >= localCacheData.getTimeoutTime()) {
  					cacheRepository.remove(key);
  				}
  			}
  		}
  		return true;
  	}
  
  }
  