Redis is the highest-leverage piece of infrastructure in most of my deployments. Used well, it takes the majority of read traffic off your primary database and smooths out spikes that would otherwise take the site down. Used badly, it serves stale data and hides bugs. The difference is strategy.
Read from cache; on a miss, read from the database and write the result back with a TTL. This is Cache::remember() in Laravel. It is simple, resilient (Redis down means slower, not broken), and right for 90% of cases. Start here and only get fancier when you have evidence.
When a hot key expires, a thousand concurrent requests can hit the database simultaneously to rebuild it. Use a lock so a single request recomputes while others briefly serve the stale value (Laravel's Cache::flexible or a Redis lock). On high-traffic apps this single pattern has prevented multiple outages for my clients.
The same Redis instance typically carries sessions, queues, and rate limiting. One warning from experience: give queues their own database number or instance in serious deployments — a cache flush should never delete your pending jobs.
The goal is not to cache everything. It is to cache the few queries that account for most of your load.