Получить доступ

Как работает паттерн cache-aside при чтении?

MiddleRedis и кэшированиеRedis
Ещё спрашивают так:
  • Что такое cache-aside?
  • Как кэшировать данные из базы в Redis?
Коротко

Cache-aside: приложение читает из кэша; при промахе идёт в базу, кладёт результат в кэш с TTL и возвращает. Источник истины — база.

  • При записи: обновить базу и удалить ключ из кэша
  • TTL ограничивает время расхождения
  • Риски: давка при истечении популярного ключа, кэширование несуществующего, гонки

А ещё Альтернативы: read-through (кэш сам ходит в базу), write-through

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Чтение:

  1. GET key из кэша;
  2. попадание — вернуть;
  3. промах — прочитать из базы, SET key value EX ttl, вернуть.

Запись: изменить данные в базе и удалить ключ (DEL key). Следующее чтение возьмёт свежие данные. Удаление вместо записи нового значения в кэш защищает от гонки, при которой старое значение перезаписывает новое.

Плюсы: просто, кэш содержит только то, что читают; при недоступности кэша можно читать из базы.

Что учесть:

  • TTL — даже при удалении ключей при записи: страховка от пропущенных инвалидаций;
  • давка — при истечении популярного ключа сотни запросов идут в базу: разброс TTL, пересчёт в один поток;
  • отрицательное кэширование — запоминать «не найдено», иначе запросы к несуществующим ключам всегда идут в базу;
  • сериализация и версия формата значения — при выкатке новая версия кода может прочитать старый формат.

Пример

def get_product(pid):
    if (cached := redis.get(f"product:{pid}")) is not None:
        return json.loads(cached)
    row = db.fetch_product(pid)
    redis.set(f"product:{pid}", json.dumps(row), ex=300 + random.randint(0, 60))  # TTL с разбросом
    return row

def update_price(pid, price):
    db.update_price(pid, price)
    redis.delete(f"product:{pid}")

Что хотят услышать

  • Шаги чтения и записи.
  • Удаление ключа при записи и почему.
  • TTL, давка, отрицательное кэширование.

Частые ошибки

  • Кэш без TTL.
  • Перезаписывать значение в кэше при записи.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Сначала читаем кэш; при промахе читаем БД и кладём результат в кэш
  • ✗Пишем и читаем только из кэша, минуя БД
  • ✗Кэш обновляется лишь по расписанию раз в сутки
  • ✗Каждое чтение идёт в БД, а кэш используется только при записи

Что спросят дальше

  • Что такое cache stampede?
  • Когда write-through лучше cache-aside?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем