Cache abstraction with in-process (Caffeine) and Redis implementations