Как устроить загрузку и кеш картинок
Вопрос
Как бы вы спроектировали загрузчик картинок для ленты?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Уровни: память (декодированные), диск (файлы), HTTP-кеш
Нужный размер с CDN и downsampling при декодировании
Склейка одинаковых запросов и отмена при уходе ячейки за экран
Prefetch по ходу скролла, приоритеты видимых
Лимиты и вытеснение (LRU), реакция на нехватку памяти
Ключ кеша с версией, плейсхолдеры и обработка ошибок
Что могут спросить следом
- Почему декодирование нельзя делать на главном потоке?
- Когда вы возьмёте готовую библиотеку, а когда свою?
Разбор
Обычно я беру готовую библиотеку, но устроена она так. При запросе картинки сначала смотрим кеш в памяти, где лежат уже декодированные и уменьшенные до размера ячейки изображения. Промах: читаем файл с диска, при его отсутствии идём в сеть. Запрашиваем у CDN картинку под размер и плотность экрана, а декодируем с downsampling в фоне. Одинаковые одновременные запросы склеиваем, а при уходе ячейки с экрана отменяем. По ходу скролла делаем prefetch, видимые картинки в приоритете. Память ограничена и вытесняется по LRU с учётом размера в байтах, на нехватку памяти реагируем очисткой. Диск тоже с лимитом и сроком. Ключ это URL с версией, поэтому обновлённый аватар подхватывается сразу.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Стратегия кеширования данных API
Следующий вопрос
Stale-while-revalidate в приложении