本地缓存实现及问题有哪些挑战?

摘要:先分享下我基于MAP实现的一个本地缓存 package org.hjb.component; import java.lang.ref.SoftReference; import java.util.Map; import java.uti
先分享下我基于MAP实现的一个本地缓存 package org.hjb.component; import java.lang.ref.SoftReference; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * 本地缓存 * * 何锦彬 2017.02.24 */ public class LocalMemory { // 数据 static class CacheData { // 过期时间 private Long invalidTime; private Object data; public Long getInvalidTime() { return invalidTime; } public void setInvalidTime(Long invalidTime) { this.invalidTime = invalidTime; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } } private static Logger logger = LogManager.getLogger(LocalMemory.class); // 存储本地缓存数据.用软引用避免OutOfMemoryError static Map<String, SoftReference<CacheData>> localData = new ConcurrentHashMap<String, SoftReference<CacheData>>(); public static final int MAX_SIZE = 10000; public static final int WARN_VALUE = 8000; /** * @param key * 缓存KEY * @param value * 缓存数据 * @param timeOut * 超时时间,单位秒 */ public static void put(String key, Object value, Long timeOut) { if (localData.size() >= WARN_VALUE) { logger.warn("注意:本地缓存已经达到临界值,size:" + localData.size()); } if (localData.size() > MAX_SIZE) { logger.error("超出最大值:" + localData.size()); return; } CacheData cacheData = new CacheData(); long now = System.currentTimeMillis(); long invalidTime = now + (timeOut * 1000); cacheData.setData(value); cacheData.setInvalidTime(invalidTime); SoftReference<CacheData> refCacheData = new SoftReference<CacheData>(cacheData); localData.p
阅读全文