Какие существуют основные стратегии инвалидации кэша

«Какие существуют основные стратегии инвалидации кэша» — вопрос из категории Архитектура, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Инвалидация кэша — это процесс удаления или обновления устаревших данных в кэше для поддержания их актуальности. Выбор стратегии зависит от требований к консистентности данных и производительности.

Основные стратегии:

  1. Time-To-Live (TTL)

    • Описание: Каждой записи в кэше присваивается "срок жизни", по истечении которого она автоматически удаляется.
    • Применение: Идеально для данных, которые могут быть неактуальными в течение короткого периода (например, погода, курсы валют, статистика).
    • Пример (Redis):
      import redis
      r = redis.Redis()
      # Ключ 'weather:moscow' будет удален через 600 секунд (10 минут)
      r.set('weather:moscow', '{"temp": 15}', ex=600)
  2. Write-Through (Сквозная запись)

    • Описание: Приложение записывает данные одновременно и в кэш, и в основную базу данных. Операция считается завершенной только после успеха в обоих хранилищах.
    • Плюс: Гарантирует высокую консистентность данных между кэшем и БД.
    • Минус: Увеличивает задержку (latency) операции записи.
  3. Explicit Invalidation (Явная инвалидация)

    • Описание: Это наиболее распространенный паттерн, также известный как Cache-Aside. Приложение само отвечает за удаление данных из кэша после их изменения в основной базе данных.
    • Пример:
      def update_user_profile(user_id, data):
        # 1. Обновляем данные в основной базе
        db.update_user(user_id, data)
        # 2. Явно удаляем старые данные из кэша
        cache.delete(f'user:{user_id}')
  4. Write-Back (Отложенная запись)

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