Проверяет понимание управления таймерами и утечек памяти при реализации TTL-кэша в JavaScript.
TTL-кэш хранит данные с ограниченным временем жизни. Для автоматического удаления записей часто используют setTimeout. Однако если просто создавать таймер для каждого ключа и забывать о нем, таймеры продолжают существовать даже после удаления записи, удерживая ссылки на объекты и не давая сборщику мусора освободить память. Это приводит к утечкам, особенно при частом добавлении и удалении ключей.
Для каждого ключа храните идентификатор таймера (например, в отдельной Map). При добавлении записи создавайте таймер, который удалит ключ по истечении TTL. При обновлении значения или повторном добавлении ключа сначала отменяйте старый таймер через clearTimeout, затем создавайте новый. При удалении записи вручную также вызывайте clearTimeout.
const cache = new Map();
const timers = new Map();
function set(key, value, ttlMs) {
if (timers.has(key)) clearTimeout(timers.get(key));
cache.set(key, value);
timers.set(key, setTimeout(() => {
cache.delete(key);
timers.delete(key);
}, ttlMs));
}
function get(key) {
return cache.get(key);
}
function del(key) {
if (timers.has(key)) clearTimeout(timers.get(key));
timers.delete(key);
cache.delete(key);
}Вместо множества таймеров можно использовать один общий таймер, который периодически проверяет и удаляет просроченные записи. Это снижает нагрузку на систему и упрощает управление, но требует хранения времени истечения для каждого ключа.
Правильное управление setTimeout в TTL-кэше критически важно для предотвращения утечек памяти и корректной работы. Всегда сохраняйте идентификатор таймера и отменяйте его при удалении или обновлении записи. Для больших кэшей предпочтительнее использовать единый периодический таймер.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию