Удаление устаревших ключей

Библиотека Idb-keyval предоставляет высокоуровневый интерфейс для работы с IndexedDB, упрощая операции хранения и извлечения данных. Одной из ключевых задач при работе с хранилищем является удаление устаревших или ненужных ключей, что позволяет поддерживать базу данных в оптимальном состоянии и экономить ресурсы.


Методы удаления ключей

Idb-keyval предоставляет несколько методов для удаления данных:

  1. del(key) — удаляет значение по конкретному ключу.

    import { del } from 'idb-keyval';
    
    del('user_123').then(() => {
        console.log('Ключ удалён');
    });

    Особенности:

    • Метод возвращает промис, который завершится после удаления.
    • Если ключа не существует, промис всё равно будет выполнен без ошибок.
  2. clear() — очищает всю базу данных.

    import { clear } from 'idb-keyval';
    
    clear().then(() => {
        console.log('База очищена');
    });

    Применение:

    • Эффективно для сброса всех данных, например, при выходе пользователя или сбросе настроек.
    • Не применимо, если требуется избирательное удаление устаревших элементов.

Удаление устаревших данных по критерию времени

В реальных приложениях часто встречается ситуация, когда данные имеют временной срок жизни. Для этого можно хранить объекты с полем timestamp и удалять устаревшие записи:

import { get, del } from 'idb-keyval';

async function removeExpired(key, ttl) {
    const item = await get(key);
    if (!item) return;

    const now = Date.now();
    if (now - item.timestamp > ttl) {
        await del(key);
        console.log(`Ключ ${key} устарел и удалён`);
    }
}

Объяснение логики:

  • ttl (Time-To-Live) задаёт допустимый период хранения в миллисекундах.
  • Сначала получаем данные через get(key).
  • Проверяем, не превышен ли срок жизни.
  • Если срок истёк, удаляем ключ через del(key).

Массовое удаление устаревших ключей

Для работы с множеством ключей удобно использовать функцию keys(), которая возвращает массив всех ключей хранилища:

import { keys, get, del } from 'idb-keyval';

async function cleanExpired(ttl) {
    const allKeys = await keys();
    const now = Date.now();

    for (const key of allKeys) {
        const item = await get(key);
        if (item && now - item.timestamp > ttl) {
            await del(key);
            console.log(`Удалён устаревший ключ: ${key}`);
        }
    }
}

Особенности:

  • Асинхронный цикл позволяет безопасно удалять элементы один за другим.
  • Можно модифицировать под параллельное выполнение, используя Promise.all, но с осторожностью, чтобы не перегрузить IndexedDB.

Практические рекомендации

  • Хранение метаданных: рекомендуется включать поле timestamp или expiry, чтобы однозначно определять устаревшие записи.
  • Регулярная очистка: в сложных приложениях имеет смысл запускать периодическую функцию очистки, например через setInterval или при загрузке страницы.
  • Идентификация устаревших ключей: если структура ключей позволяет группировать по префиксам (user_, cache_), можно выполнять выборочную очистку только для конкретной группы.

Примеры использования с разными TTL

// Удаление устаревших кэшей на 24 часа
const ONE_DAY = 24 * 60 * 60 * 1000;
cleanExpired(ONE_DAY);

// Удаление устаревших сессий на 1 час
const ONE_HOUR = 60 * 60 * 1000;
cleanExpired(ONE_HOUR);

Такой подход позволяет эффективно управлять данными, минимизировать рост базы и поддерживать производительность приложений на долгом сроке эксплуатации.


Совмещение с другими операциями

Idb-keyval поддерживает сочетание операций:

import { set, get, del } from 'idb-keyval';

async function updateAndClean(key, value, ttl) {
    await set(key, { value, timestamp: Date.now() });
    await removeExpired(key, ttl);
}

Это удобно для обновления данных и автоматической очистки устаревших версий в одном потоке.


Удаление устаревших ключей в Idb-keyval — фундаментальный механизм управления хранилищем. Использование del, clear, keys и логики TTL позволяет поддерживать данные актуальными, освобождать память и обеспечивать высокую производительность приложений на JavaScript.