What we build with it

Redis holds the data a service needs immediately and could regenerate if it lost it. Cached query results that would otherwise hit the database on every request, session state, rate-limit counters, short-lived locks, and the job queues that move slow work out of the request path.

That last one is usually the biggest win in a product. Sending an email, generating a document, or calling a third-party API does not belong inside the HTTP request a user is waiting on — pushing it onto a queue is what keeps a page responsive when a downstream service is having a bad day.

Where it fits

In front of PostgreSQL, not instead of it. The pattern we use is boring on purpose: the relational database owns the truth, Redis owns whatever is worth not recomputing, and every key has an expiry so a stale cache is a temporary problem rather than a permanent one.

When we recommend it

When a specific query is measurably hot, when you need background jobs, or when state has to be shared across several instances of a service.

Not as a first move. Adding a cache before you know what is slow buys you a second system to operate and a new class of bug — data that is correct in one place and wrong in another. Measure first, then cache the thing the profile actually points at.

When a specific query is measurably hot, when you need background jobs, or when state has to be shared across several instances of a service.
As a first move. Adding a cache before you know what is slow buys you a second system to operate and a new class of bug, data that is correct in one place and wrong in another. Measure first, then cache the thing the profile actually points at.
No. It sits in front of PostgreSQL, not instead of it. The relational database owns the truth, Redis owns whatever is worth not recomputing, and every key has an expiry so a stale cache is a temporary problem rather than a permanent one.