Ответ вслух Middle Кеширование обновлено

Как устроить загрузку и кеш картинок

Вопрос

Как бы вы спроектировали загрузчик картинок для ленты?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

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

Что должно прозвучать в ответе

  • Уровни: память (декодированные), диск (файлы), HTTP-кеш

  • Нужный размер с CDN и downsampling при декодировании

  • Склейка одинаковых запросов и отмена при уходе ячейки за экран

  • Prefetch по ходу скролла, приоритеты видимых

  • Лимиты и вытеснение (LRU), реакция на нехватку памяти

  • Ключ кеша с версией, плейсхолдеры и обработка ошибок

Что могут спросить следом

  • Почему декодирование нельзя делать на главном потоке?
  • Когда вы возьмёте готовую библиотеку, а когда свою?

Разбор

Обычно я беру готовую библиотеку, но устроена она так. При запросе картинки сначала смотрим кеш в памяти, где лежат уже декодированные и уменьшенные до размера ячейки изображения. Промах: читаем файл с диска, при его отсутствии идём в сеть. Запрашиваем у CDN картинку под размер и плотность экрана, а декодируем с downsampling в фоне. Одинаковые одновременные запросы склеиваем, а при уходе ячейки с экрана отменяем. По ходу скролла делаем prefetch, видимые картинки в приоритете. Память ограничена и вытесняется по LRU с учётом размера в байтах, на нехватку памяти реагируем очисткой. Диск тоже с лимитом и сроком. Ключ это URL с версией, поэтому обновлённый аватар подхватывается сразу.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме