ConcurrentHashMap 实现带过期时间的缓存
时间: 2023-11-01 19:56:36 浏览: 207
要实现带过期时间的缓存,可以使用 `ConcurrentHashMap` 结合 `ScheduledExecutorService` 来实现。
首先,使用 `ConcurrentHashMap` 存储缓存的键值对,键为缓存的 key,值为缓存的 value。
然后,使用 `ScheduledExecutorService` 定时清除过期的缓存。可以通过定时任务调度线程池来实现。
下面是一个简单的示例代码:
```java
import java.util.Map;
import java.util.concurrent.*;
public class ExpiringCache<K, V> {
private final Map<K, V> cache;
private final ScheduledExecutorService scheduler;
public ExpiringCache() {
this.cache = new ConcurrentHashMap<>();
this.scheduler = Executors.newSingleThreadScheduledExecutor();
}
// 添加缓存项
public void put(K key, V value, long expireTimeMillis) {
cache.put(key, value);
// 在指定时间后清除缓存项
scheduler.schedule(() -> cache.remove(key), expireTimeMillis, TimeUnit.MILLISECONDS);
}
// 获取缓存项
public V get(K key) {
return cache.get(key);
}
// 移除缓存项
public void remove(K key) {
cache.remove(key);
}
}
```
使用示例:
```java
ExpiringCache<String, String> cache = new ExpiringCache<>();
cache.put("key1", "value1", 5000); // 缓存项在5秒后过期
cache.put("key2", "value2", 10000); // 缓存项在10秒后过期
String value1 = cache.get("key1"); // 获取缓存项,如果过期则返回 null
String value2 = cache.get("key2");
System.out.println(value1); // 输出:value1
System.out.println(value2); // 输出:value2
Thread.sleep(6000);
String expiredValue = cache.get("key1");
System.out.println(expiredValue); // 输出:null,缓存项已过期
```
注意,该示例代码只是一个简单的实现,没有考虑并发情况下的线程安全性和性能优化,如果在实际项目中使用,请根据需求进行适当的改进。
阅读全文