Простой LRU-кеш в Java без дополнительных библиотек
LRU удаляет запись, к которой дольше всего не обращались. Для небольшого кеша достаточно LinkedHashMap:
import java.util.LinkedHashMap;
import java.util.Map;
class LruCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
LruCache(int capacity) {
super(16, 0.75f, true);
if (capacity <= 0) {
throw new IllegalArgumentException(
"capacity must be positive"
);
}
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(
Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
Третий аргумент true включает порядок по обращениям: успешный get() переносит запись в конец. После добавления новой записи removeEldestEntry() позволяет удалить первую, если лимит превышен.
var cache = new LruCache<String, Integer>(2);
cache.put("A", 1);
cache.put("B", 2);
cache.get("A"); // Теперь B использовали давнее
cache.put("C", 3); // Удалится B
System.out.println(cache.keySet()); // [A, C]
Лимит задаётся числом записей, а не объёмом памяти. TTL здесь нет, и кеш не потокобезопасен. Более того, даже get() может менять внутренний порядок, поэтому параллельные чтения тоже требуют синхронизации.
Views: 67