Ответ
Ответ не найден
Ответ 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 и торжественно заявляет: «Ответ не найден, братан». И будет так орать, пока кэш не протухнет через час. Вот тебе и волнение ебать, и доверия к системе — ноль.
Как лечить эту хитрожопую ситуацию?
-
Не кэшируй отрицательные ответы. Самый простой способ. Не нашёл в базе — хуй с горы, в кэш ничего не пиши.
if (user) { cache.set(id, user, 3600); // Кэшируем только если НЕ null } else { // cache.set(id, user, 3600); // А ЭТОГО НЕ ДЕЛАЕМ! Вот тут и была зарыта собака, сука. } -
Используй «сброс кэша» (cache invalidation). Это священный Грааль для прогеров. При любом изменении данных (восстановление пользователя) — прибивай соответствующую запись в кэше.
// Админ восстановил пользователя database.restoreUser(id); // И тут же выпиливаем старый, неправильный кэш cache.delete(id); -
Ставь мизерный TTL для негативных ответов. Если уж очень хочется кэшировать факт отсутствия (чтобы базу не дрочить часто по несуществующим ID), кэшируй его на 10 секунд, а не на час. Пусть живёт чуть-чуть.
Короче, мораль всей этой басни: кэш — он как умный друг, который должен помнить, где что лежит, но не должен на полном серьёзе утверждать, что водки нет, если он просто забыл, куда её спрятал. А то получится, как в том анекдоте: «Доктор, у меня то руки не поднимаются, то ноги!» — «А вы, блядь, не поднимайте!». Вот и с кэшем так — если он начинает врать, что чего-то нет, пора его, суку, поправить. Или вообще не трогать в этом месте.