Sobes.tech
Назад к вопросам
Senior
3

Какие стратегии инвалидации кэша бывают в Redis? Какие данные кэшировать, какие нет? L1/L2 кэширование.

Компании, где спрашивали
Uzum

Ответ от нейросети

sobes.tech AI

Стратегии инвалидации кэша в Redis:

  1. Время жизни (TTL) — установка срока жизни ключа, после которого он автоматически удаляется.
  2. Явное удаление (Cache Eviction) — при обновлении или удалении данных в источнике кэша удалять соответствующие ключи.
  3. Write-through — при записи данных сначала обновлять кэш, затем базу.
  4. Write-back — обновлять кэш, а запись в базу делать асинхронно.
  5. Cache Aside (Lazy Loading) — при запросе сначала проверять кэш, при промахе загружать из БД и записывать в кэш.

Какие данные кэшировать:

  • Часто запрашиваемые, редко изменяющиеся данные (списки, справочники).
  • Результаты тяжёлых вычислений.

Какие не стоит кэшировать:

  • Часто изменяющиеся данные с высокой динамикой.
  • Конфиденциальные данные без дополнительной защиты.

L1/L2 кэширование:

  • L1 (Level 1) — локальный кэш в памяти приложения (например, в Go map или библиотеке), быстрый доступ, но ограничен одним экземпляром.
  • L2 (Level 2) — распределённый кэш, например Redis, доступен всем инстансам приложения.

Комбинация L1 и L2 позволяет снизить нагрузку на Redis и базу, обеспечивая баланс между скоростью и консистентностью.


Пример использования Cache Aside с Redis в Go:

val, err := redisClient.Get(ctx, key).Result()
if err == redis.Nil {
    // Кэш промах — получить из БД
    val = getFromDB(key)
    // Записать в кэш с TTL
    redisClient.Set(ctx, key, val, time.Minute*10)
} else if err != nil {
    // Обработка ошибки Redis
}
// Использовать val

Такой подход прост и эффективен для большинства сценариев.