Skip to main content
Metrics type: Key MetricsCategory: Cross-Platform: Revenue at Risk

At a glance

This card lines up Redis connection-pool saturation (connected_clients against the configured maxclients) against the storefront traffic burst happening at the same moment. When a flash sale, an email send, or a paid-media spike drives a surge of web and app requests, each new application worker opens Redis connections. If saturation crosses 90% of maxclients during that burst, Redis starts refusing new connections, which silently drops downstream services: sessions fail to load, carts cannot be read, and checkout stalls. The card exists to catch that moment while it is happening, not after the revenue has already leaked.

Calculation

For each sampled row in the 15-minute window the card computes Redis saturation as connected_clients / maxclients * 100, where connected_clients comes from INFO clients and maxclients from CONFIG GET maxclients (the effective cap, which on managed services is set below the OS file-descriptor limit). Alongside it the card pulls the storefront traffic level for the same minute from the linked ecommerce connector and flags whether that minute is a “burst” (traffic materially above the trailing baseline). The alert fires only when a row shows saturation above 90% AND the same row is inside a traffic burst. That join is the whole point: it separates a benign idle-pool reading from a genuine “we are about to refuse connections while shoppers are queuing” event.

Worked example

A DTC apparel brand on Shopify runs a single ElastiCache for Redis primary with maxclients set to 10,000. Their checkout, session store, and rate-limiter all share this instance. On 14 Apr 26 they send a 09:00 launch email to 240,000 subscribers. The platform team is watching the Nerve Centre. At 09:01 the card crosses the alert line: saturation hits 90% during a confirmed traffic burst. By 09:02 the pool is effectively full and rejected_connections begins to climb (visible on the sibling Rejected Connections (24h) card). New application workers cannot get a Redis connection, so session reads start to fail and a fraction of shoppers see a blank cart or a checkout error.
The takeaway for the owner is commercial, not technical: for roughly 90 seconds during the single highest-intent traffic moment of the week, a slice of shoppers could not complete checkout. The card turns an obscure infra metric into “we nearly lost the first two minutes of the launch”, which is the framing that justifies raising maxclients or splitting the instance before the next send.

Sibling cards

Reconciling against the source

Where to look natively:
redis-cli INFO clients for the live connected_clients, blocked_clients, and cluster_connections fields. redis-cli CONFIG GET maxclients for the effective connection cap (this can be lower than the OS limit, especially on managed tiers). redis-cli CLIENT LIST to enumerate every open connection with its source address, age, and last command, useful for spotting a single misbehaving service holding hundreds of connections. redis-cli INFO stats for rejected_connections, the cumulative count of refusals.
On Amazon ElastiCache: the CurrConnections and NewConnections CloudWatch metrics mirror connected_clients, and the node’s documented connection limit stands in for maxclients. Why our number may legitimately differ:

Known limitations / FAQs

Saturation is high but there is no traffic burst. Does the alert fire? No, and that is deliberate. High connected_clients with no storefront burst usually means leaked or idle connections (a service that opens connections but never closes them, or a missing connection pool). That is a real problem worth fixing, but it is not revenue-at-risk in the way a saturation-during-burst event is. Use the plain Clients vs maxclients % card to chase idle-connection leaks. Why measure against maxclients rather than the OS file-descriptor limit? maxclients is the cap Redis actually enforces; once connected_clients reaches it, Redis returns an error to the next client regardless of how many file descriptors the OS could theoretically provide. On managed services the OS limit is invisible to you anyway, so maxclients is the meaningful ceiling. Our workers use connection pooling. Why did we still saturate? Connection pooling caps connections per worker, not across the fleet. When autoscaling triples the worker count during a burst, total demand is workers multiplied by pool size, and that can outrun a fixed maxclients even though each individual worker is well-behaved. The fix is either more headroom on maxclients or a smaller per-worker pool. We are on Redis Cluster. How is saturation read? Per node. Each shard has its own maxclients, so the card reads the most saturated node rather than an average. A single hot slot range can saturate one shard while the rest sit idle, which is exactly the situation an average would hide. The burst is from bots, not shoppers. Is that still revenue at risk? The connection pressure is real either way: bots opening connections can still starve legitimate shoppers of capacity. But if the burst is bot-driven the right fix is rate-limiting or blocking at the edge, not raising maxclients. Pair this with Redis OPS Spike vs Ecom Order Rate: a command spike with no matching order spike is the bot / stampede signature. Can I change the 90% threshold? Yes. The saturation threshold is configurable per profile in the Alert Rules tab. Instances that run hot by design may prefer 95%, while a tightly provisioned shared instance may want 80% to leave a wider safety margin before refusals begin.

Tracked live in Vortex IQ Nerve Centre

Connected Clients Saturation vs Traffic Burst is one of hundreds of KPI pulses Vortex IQ tracks across Redis and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.