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

Ответ

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

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

  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 (Отложенная запись)

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

Ответ 18+ 🔞

А, ну вот, опять про эту вашу инвалидацию кэша, блядь! Ну, сидит такой разработчик, думает: "О, я сейчас всё закеширую, производительность будет овердохуища!" А потом, сука, данные в базе поменялись, а в кэше — старые, и пошёл пиздец, пользователи видят хуйню. Так вот, чтобы этого не было, есть несколько способов этот кэш почистить, то есть инвалидировать. Выбирай, в зависимости от того, насколько тебе важна свежесть данных и скорость.

Смотри, какие есть варианты, блядь:

  1. Время жизни (TTL) Это как йогурт в холодильнике, ёпта. Положил — и он через N часов протухнет сам. Так и тут: задаёшь записи срок годности, и она сама удалится. Идеально для всякой ерунды, которой можно быть немного устаревшей. Ну, там, погода, курсы доллара (хотя они, блядь, меняются каждую секунду), топ постов за час.

    import redis
    r = redis.Redis()
    # Ключ 'weather:moscow' сдохнет сам через 600 секунд
    r.set('weather:moscow', '{"temp": 15}', ex=600)

    Поставил и забыл. Главное — срок правильно подобрать, а то пользователи будут смотреть на вчерашний снег, а на улице, блядь, +30.

  2. Сквозная запись (Write-Through) Тут ты, сука, перфекционист. Каждая операция записи идёт сразу в два места: и в кэш, и в основную базу. Только когда оба места сказали "ок", ты успокаиваешься.

    • Плюс: Данные везде, блядь, как штык, консистентные. Идеал.
    • Минус: Скорость записи — хуйня. Ты ждёшь отклика от двух систем, а это, блядь, как две очереди в поликлинике отстоять. Задержка увеличивается, терпения ноль ебать.
  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) О, это для экстремалов, которым скорость записи важнее всего на свете! Данные летят прямиком в кэш — быстро, как хуй с горы. А в базу они записываются потом, не спеша, асинхронно: раз в минуту, раз в пять, когда там очередь накопится.

    • Плюс: Запись — просто космос, мгновенная.
    • Минус: Риск, блядь, огромный! Если кэш, сука, накрылся медным тазом до того, как данные сбросились в базу — всё, пиши пропало. Данные похерились навсегда. Это как написать гениальную мысль на салфетке, а потом её в стирку сунуть. Пиздец, а не стратегия.

Вот и вся философия, блядь. Выбирай, что тебе ближе: надёжность, скорость или чтобы само всё как-то работало. Главное — понимать, за что ты платишь в каждой схеме, а то потом волнение ебать, когда продакшн ляжет.