- Каждая запись должна иметь время жизни (TTL), после которого срок ее действия автоматически истекает
- Поддержка put(key, value, ttl) и get(key) операций
- должен выполняться за время O(1)
Код: Выделить всё
get() - Несколько потоков должны иметь возможность читать и писать одновременно
- Просроченные записи должны быть очищены без блокировки обычных операций
- Используйте ядро Java только (без внешних библиотек)
Код: Выделить всё
import java.util.concurrent.*; import java.util.*; public class BrokenTTLCache { class CacheItem { V value; long expiryTime; CacheItem(V value, long expiryTime) { this.value = value; this.expiryTime = expiryTime; } } private final Map cache = new HashMap(); private final ScheduledExecutorService cleaner = Executors.newSingleThreadScheduledExecutor(); public BrokenTTLCache() { cleaner.scheduleAtFixedRate(this::cleanUp, 0, 1, TimeUnit.MILLISECONDS); } public void put(K key, V value, long ttlMillis) { long expiryTime = System.currentTimeMillis() + ttlMillis; cache.put(key, new CacheItem(value, expiryTime)); } public V get(K key) { CacheItem item = cache.get(key); if (System.currentTimeMillis() > item.expiryTime) { cache.remove(key); return null; } return item.value; } private void cleanUp() { for (K key : cache.keySet()) { CacheItem item = cache.get(key); if (System.currentTimeMillis() > item.expiryTime) { cache.remove(key); } } } public static void main(String[] args) throws Exception { BrokenTTLCache cache = new BrokenTTLCache(); cache.put("X", "Bug", 1000); Thread.sleep(1500); System.out.println(cache.get("X")); } } \
Подробнее здесь: https://stackoverflow.com/questions/798 ... llowing-fe