Sobes.tech
Junior
156
questionbank

Какой самый простой способ реализации кэширования?

Ответ от нейросети

sobes.tech AI

Самый простой способ реализации кэширования в Java на уровне приложения — использование HashMap или ConcurrentHashMap (для многопоточного доступа) в качестве кэша в памяти.

Пример с ConcurrentHashMap:

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

public class SimpleCache<K, V> {

    private final ConcurrentHashMap<K, CacheEntry<V>> cache = new ConcurrentHashMap<>();
    private final long ttl; // Time to Live in milliseconds

    public SimpleCache(long ttl) {
        this.ttl = ttl;
    }

    public V get(K key) {
        CacheEntry<V> entry = cache.get(key);
        if (entry == null) {
            return null;
        }

        // Проверяем на истечение срока действия
        if (System.currentTimeMillis() > entry.timestamp + ttl) {
            cache.remove(key); // Удаляем устаревшую запись
            return null;
        }

        return entry.value;
    }

    public void put(K key, V value) {
        cache.put(key, new CacheEntry<>(value, System.currentTimeMillis()));
    }

    public void remove(K key) {
        cache.remove(key);
    }
    
    private static class CacheEntry<V> {
        final V value;
        final long timestamp;

        CacheEntry(V value, long timestamp) {
            this.value = value;
            this.timestamp = timestamp;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        // Кэш с TTL 5 секунд
        SimpleCache<String, String> cache = new SimpleCache<>(TimeUnit.SECONDS.toMillis(5));

        cache.put("key1", "value1");
        System.out.println("Получено (до истечения): " + cache.get("key1")); // value1

        Thread.sleep(6000); // Ждем 6 секунд

        System.out.println("Получено (после истечения): " + cache.get("key1")); // null
    }
}

Этот пример демонстрирует базовое кэширование с поддержкой TTL (Time-To-Live). Более сложные сценарии требуют использования специализированных библиотек, таких как Ehcache или Caffeine, которые предоставляют продвинутые функции:

  • Политики вытеснения (LRU, LFU и т.д.)
  • Прозрачное чтение и запись (read-through, write-through)
  • Инвалидация кэша по событиям
  • Распределенное кэширование