Every cache eventually lies. The moment data lands in memory, it starts drifting from the source of truth. The question isn't whether to invalidate, it's which failure mode you're willing to accept.
Knowing the names isn't the signal. Naming which failure mode you're willing to accept, and why, is what separates a candidate who's memorized patterns from one who's thought through the system.
Cache invalidation is famously hard, and you've added a new failure surface. The speed gain is real, but so is the operational cost. That tradeoff is what makes caching a deliberate choice, not a default.
Read replicas and Redis both reduce load on your primary database. They're not interchangeable. They operate at different layers, and picking the wrong one for your bottleneck is a common system design mistake.
A cache like Redis sits between your app and your database, serving repeated reads from memory with no disk access. That's the difference between ~1ms and ~50ms per read. The tradeoff is you're now responsible for keeping that data consistent.
Jump Game II looks like a DP problem. Choices at every step, a minimum to optimize, overlapping subproblems. It's greedy, and the reason why is worth understanding.