无法使用redis或其他中间件时,Java本地缓存实现
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
public class SimpleLocalCache<K, V> {
private final ConcurrentHashMap<K, CacheEntry<V>> cache = new ConcurrentHashMap<>();
public V get(K key) {
CacheEntry<V> entry = cache.get(key);
if (entry != null && !entry.isExpired()) {
return entry.value;
}
return null;
}
public void put(K key, V value, long timeout, TimeUnit timeUnit) {
long expiryTime = (timeout > 0) ? System.currentTimeMillis() + timeUnit.toMillis(timeout) : 0;
cache.put(key, new CacheEntry<>(value, expiryTime));
}
public void remove(K key) {
cache.remove(key);
}
public void clear() {
cache.clear();
}
private static class CacheEntry<V> {
private final V value;
private final long expiryTime;
public CacheEntry(V value, long expiryTime) {
this.value = value;
this.expiryTime = expiryTime;
}
public boolean isExpired() {
return expiryTime > 0 && System.currentTimeMillis() > expiryTime;
}
}
}
// 使用示例
public class CacheUsageExample {
public static void main(String[] args) {
SimpleLocalCache<String, String> cache = new SimpleLocalCache<>();
// 存储一个键值对,有效期10秒
cache.put("key", "value", 10, TimeUnit.SECONDS);
// 获取键对应的值
String value = cache.get("key");
System.out.println("Value from cache: " + value);
// 等待10秒后
// 再次获取键对应的值
value = cache.get("key");
System.out.println("Value from cache after timeout: " + value); // 应该为null,因为键值对已过期
// 移除键值对
cache.remove("key");
// 清空缓存
cache.clear();
}
}
这个简单的本地缓存实现使用了ConcurrentHashMap
来存储键值对,并通过CacheEntry
类来管理每个条目的过期时间。它提供了基本的缓存操作,如获取、存储、移除和清空缓存。当尝试获取已过期的条目时,会返回null
。这个实现没有提供复杂的缓存策略,如LRU、LFU或者缓存空间回收,但它展示了一个基本的缓存抽象和实现。
评论已关闭