Redis is an in-memory data structure store used as a cache, a database and a message broker. Rather than tables or documents, it exposes typed structures directly — strings, hashes, lists, sets, sorted sets, bitmaps, HyperLogLogs and streams — and operates on them with commands that are individually atomic. The core command execution path is single-threaded, which is why Redis is both extremely predictable and extremely unforgiving: one slow command blocks every other client on that instance.
Because the working set lives in memory, the operational questions are different from those of a disk-based database. How much memory the dataset really occupies, which maxmemory-policy governs eviction, whether persistence uses RDB snapshots, the append-only file, or both, and what each choice actually costs at fork time on a large instance — these decisions determine whether Redis is a cache you can lose or a datastore you cannot. Durability in Redis is a spectrum you configure, not a guarantee you inherit.
Scaling and availability come from two separate mechanisms that are often confused. Replication plus Sentinel gives automatic failover for a single logical dataset; Redis Cluster shards the keyspace across 16,384 hash slots with its own client protocol, redirection behaviour and resharding process. Both change what clients must handle. Add ACLs, TLS, the slow log, latency monitoring and keyspace analysis, and the operational surface is substantial — and it stays substantial on ElastiCache, Memorystore or a Kubernetes operator, where the instances are managed but the eviction policy, key design and failover behaviour are still yours.
Why this skill matters now
Redis has ended up in the critical path of far more systems than were designed for it. It starts as a cache, then holds sessions, then rate limits, then a job queue, then a lock — and at some point losing it means an outage rather than a slow page. Very few teams re-examine the configuration when that transition happens, which is why so many production incidents trace back to a Redis instance still running with the defaults it was installed with.
The failure modes are specific and teachable. A KEYS or a large SMEMBERS on the single-threaded command loop stalls every client. An instance with no maxmemory set grows until the kernel kills it. An RDB fork on a large instance doubles resident memory on a host with no headroom. Replication is asynchronous, so a Sentinel failover silently loses the last writes. A client library that does not understand MOVED and ASK redirection fails intermittently after a resharding. None of these produce a helpful error message; they produce latency and confusion.
The surrounding landscape has also shifted. Licence changes upstream produced the Valkey fork and a set of drop-in alternatives, so choosing what to run — and knowing how compatible the options are — has become part of the operator's job rather than a formality. Meanwhile every managed offering still leaves key design, eviction policy, memory headroom and failover semantics to the team that owns the service.