Что такое структура HTTP-запроса

Ответ

Ответ не найден

Ответ 18+ 🔞

Боже, ну вот опять эти ваши хуёвые баги с кэшем, ёпта! Сидишь такой, кодишь себе спокойно, а тут — раз! — и ответ не найден, как будто ты его в пизду отправил. Я тебе щас объясню, что за манда с ушами тут происходит, чтобы ты не охуевал в следующий раз.

Представь, ты пишешь функцию, которая ищет пользователя по ID. Всё просто, казалось бы.

function getUser(id) {
  // Проверяем кэш — вдруг уже искали этого ушлёпка?
  const cachedUser = cache.get(id);
  if (cachedUser) {
    console.log('Взял из кэша, не паримся!');
    return cachedUser;
  }

  // Если в кэше пусто — идём в базу, ебать колотить
  const user = database.query('SELECT * FROM users WHERE id = ?', id);

  // Нашли? Супер, кладём в кэш, чтобы два раза не бегать
  if (user) {
    cache.set(id, user, 3600); // Живёт час
  }

  return user; // Возвращаем, даже если это null
}

Всё вроде логично, да? Но жизнь — штука пиздопроебибная. Допустим, пользователь удалён. Твоя функция вернёт null. И что делает твой гениальный код? Правильно, кладёт этот null в кэш! Запоминает, что пользователя с ID 123 — нету.

А теперь внимание, фокус: админ восстанавливает удалённого пользователя через админку. База данных обновилась, запись вернулась. Но твой сервер-то об этом не знает! Он как честный дурак при следующем запросе лезет в кэш, видит там null и торжественно заявляет: «Ответ не найден, братан». И будет так орать, пока кэш не протухнет через час. Вот тебе и волнение ебать, и доверия к системе — ноль.

Как лечить эту хитрожопую ситуацию?

  1. Не кэшируй отрицательные ответы. Самый простой способ. Не нашёл в базе — хуй с горы, в кэш ничего не пиши.

    if (user) {
      cache.set(id, user, 3600); // Кэшируем только если НЕ null
    } else {
      // cache.set(id, user, 3600); // А ЭТОГО НЕ ДЕЛАЕМ! Вот тут и была зарыта собака, сука.
    }
  2. Используй «сброс кэша» (cache invalidation). Это священный Грааль для прогеров. При любом изменении данных (восстановление пользователя) — прибивай соответствующую запись в кэше.

    // Админ восстановил пользователя
    database.restoreUser(id);
    // И тут же выпиливаем старый, неправильный кэш
    cache.delete(id);
  3. Ставь мизерный TTL для негативных ответов. Если уж очень хочется кэшировать факт отсутствия (чтобы базу не дрочить часто по несуществующим ID), кэшируй его на 10 секунд, а не на час. Пусть живёт чуть-чуть.

Короче, мораль всей этой басни: кэш — он как умный друг, который должен помнить, где что лежит, но не должен на полном серьёзе утверждать, что водки нет, если он просто забыл, куда её спрятал. А то получится, как в том анекдоте: «Доктор, у меня то руки не поднимаются, то ноги!» — «А вы, блядь, не поднимайте!». Вот и с кэшем так — если он начинает врать, что чего-то нет, пора его, суку, поправить. Или вообще не трогать в этом месте.