Просто попал в базу данных несколько раз. Однажды я подумал, что это умная идея - загружать изображения вместе с текстом в кеш, а затем делать недействительным кеш, когда их обслуживают. Мне также пришлось генерировать случайные URL-адреса, чтобы разные пользователи не делали кэш другого недействительным. Я думал, что было так умно сократить количество запросов к БД.
Мне теперь так стыдно за эту "хитрость", и я никому не говорю. Не думайте об этом, если у вас нет реальной проблемы с производительностью.
Важно реализовать кэширование на стороне клиента, задав соответствующие заголовки. Изображения лучше кэшируются на клиенте, чем на сервере, потому что даже если вы кэшируете на сервере, вы все равно получаете удар по сети, если не кэшируете на клиенте.
Также попадание в базу данных по первичному ключу (я предполагаю, что именно так вы собираетесь получать изображения) - не дорогая операция, и если только изображения не занимают 2 МБ +, я бы не стал беспокоиться о переносе из базы данных на веб-сервер.
Редактировать: И я только что рассказал всем о своем стыде: (