import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class Cache { private final ConcurrentHashMap map; private final long timeOut; private ScheduledExecutorService thread; //无参构造永久不过期 public Cache(){ this(0); } //有参构造设置过期时间 public Cache(long timeOut){ map = new ConcurrentHashMap<>(); this.timeOut = timeOut; //定时清理过期数据 thread = Executors.newSingleThreadScheduledExecutor(); thread.scheduleAtFixedRate(this::clearTimeOut,2,2,TimeUnit.SECONDS); } //存入缓存 public void put(Object key,Object value){ put(key,value,timeOut); } //自定义过期时间存放 public void put(Object key,Object value,long ttl){ long endTime = ttl == 0 ? Long.MAX_VALUE : System.currentTimeMillis()+ttl; map.put(key,new CacheNode(value,endTime)); } //获取缓存 public Object get(Object key){ CacheNode node = map.get(key); if(node == null){ return null; } //判断是否过期 if(System.currentTimeMillis()>node.endTime){ map.remove(key); return null; } return node.value; } //删除缓存 public void remove(Object key){ map.remove(key); } //清理过期数据 private void clearTimeOut(){ map.entrySet().removeIf(e->System.currentTimeMillis()>e.getValue().endTime); } //关闭线程防止资源泄露 public void close(){ thread.shutdown(); } //内部存储节点 private static class CacheNode{ Object value; long endTime; public CacheNode(Object value,long endTime){ this.value = value; this.endTime = endTime; } } //测试运行 public static void main(String[] args) throws InterruptedException { //设置5秒过期 Cache cache = new Cache(5000); cache.put("学号","2026001"); System.out.println("存入立刻获取:"+cache.get("学号")); Thread.sleep(6000); System.out.println("6秒后获取(已过期):"+cache.get("学号")); cache.close(); } }