What if the fastest database call never left your process? Architectural trade-offs of in-process caching and server invalidation