流程序有段代码是调用一个接口获取元数据信息,由于调用频繁,元数据有更新接口会重新上线,流就会收到影响,简单实现个缓存工具类,设置超时时间就欧了,既较少调用频率,也保证接口重新上线这段时间流受到影响的概率降低。
直接上代码,考虑多线程的情况,使用 ConcurrentHashMap
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by dingyufei on 2019/11/18.
*/
public class CacheUtil {
// 缓存map
private static ConcurrentHashMap<String,Object> cacheMap=new ConcurrentHashMap<>();
// 缓存key有效期map
private static ConcurrentHashMap<String, Long> expireTimeMap = new ConcurrentHashMap<>();
/**
* 获取指定的value,如果key不存在或者已过期,则返回null
*
* @param key
* @return
*/
public static Object get(String key) {
if (!cacheMap.containsKey(key)) {
return null;
}
if (expireTimeMap.containsKey(key)) {
if (expireTimeMap.get(key) < System.currentTimeMillis()) { // 缓存失效,已过期
return null;
}
}
return cacheMap.get(key);
}
/**
* 设置value(不过期)
*
* @param key
* @param value
*/
public static void set(String key, Object value) {
cacheMap.put(key, value);
}
/**
* 设置value
*
* @param key
* @param value
* @param millSeconds 过期时间(毫秒)
*/
public static void set(final String key, Object value, int millSeconds) {
final long expireTime = System.currentTimeMillis() + millSeconds;
cacheMap.put(key, value);
expireTimeMap.put(key, expireTime);
if (cacheMap.size() > 3) { // 清除过期数据
Iterator<Map.Entry<String, Object>> iterator = cacheMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Object> entry = iterator.next();
if (expireTimeMap.containsKey(entry.getKey())) {
long expireTime1 = expireTimeMap.get(key);
if (System.currentTimeMillis() > expireTime1) {
iterator.remove();
expireTimeMap.remove(entry.getKey());
}
}
}
}
}
/**
* key是否存在
*
* @param key
* @return
*/
public static boolean isExist(String key) {
return cacheMap.containsKey(key);
}
}