🔴 Сложный · 3 очк. Redis
Какая стратегия инвалидации кеша наиболее надёжна?
A Только по TTL
B Cache-aside: пишем в БД, удаляем из кеша
C Пишем в кеш, потом в БД
D Никогда не инвалидируем
Объяснение вопроса

Наиболее надёжная стратегия - Cache-Aside с инвалидацией через удаление (при записи удалять ключ из кеша, а не обновлять его).

Почему удаление, а не обновление

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

Алгоритм Cache-Aside

  1. Чтение: проверить кеш; при промахе - прочитать из БД, записать в кеш
  2. Запись: обновить БД, удалить ключ из кеша (не перезаписывать)
// Чтение
val, err := cache.Get(ctx, key)
if err == redis.Nil {
    val, err = db.Get(ctx, key)
    if err != nil { return err }
    cache.Set(ctx, key, val, ttl)
}
return val, nil

// Запись
if err := db.Set(ctx, key, newVal); err != nil { return err }
cache.Del(ctx, key)  // удалить, не обновлять

Так при любом сбое (например, запись в кеш не удалась) следующее чтение получит свежие данные из БД.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.