I don’t think there’s a ‘correct’ way here, it might just come down to where it’s most logical to actually trigger the fetching and caching.
If it’s output from a block, within the block controller makes sense.
If it’s a particular page type, or single page, that page’s controller
If it’s a common function that needs to be accessed from lots of places, I’d probably put the code in a custom package (or at least in a package related to where I need the data), in a custom class, maybe a static function.
Personally I try to avoid adding things in the /application directory if they’re not just overrides or minor customisations, and instead look to put that code in packages.