И пусть меня затопчат, но как по мне, чем глубже мы закапываем логику выбора из кеша или бд, тем меньше пользы он нам вообще принесет. Кеширование нужно ставить максимально ближе к запросу, получил запрос есть в кеше отдал, нет пошел дальше. Поэтому в контроллере как мне кажется ему и самое место. Главное это написать все красиво и не навредить.