
When an AWS bill climbs, the reflex is to approve a bigger database, however, the load often isn't the real problem. This piece uses a common pattern to show how a cheap, misconfigured cache can quietly push expensive work onto the database it was meant to protect. The goal is to explain why more capacity is frequently the wrong fix, and what to check before paying for it.
When the Cache Isn't Doing Its Job, the Database Pays the Price
One of the most expensive databases reviewed this year had a strangely simple problem: it kept solving the same questions from scratch, thousands of times an hour, at a price point built for far harder work.
Same product pages. Same lookups. Thousands of times an hour. A big, always-on, premium-priced database asked, over and over, to re-derive answers it had already produced.
Ahead of it, there was supposed to be a cache. Its entire job is to absorb exactly that repetition. When it's doing its job, the database barely notices the load. When it isn't, every request lands on the database directly, and the response is usually to provision more databases, when the real fix was to stop that traffic from reaching it at all.
From a finance seat, this tends to get read as a scaling problem: traffic is up, so a bigger database gets approved. However, often that's the wrong diagnosis. What's actually happening is a cheap component, the cache, quietly failing to protect an expensive one. And that fix costs a fraction of the upgrade.
But there's an important exception here:
A low cache hit rate is not automatically a problem. Some workloads are genuinely low in repetition: every request is unique or personalized, so there is simply nothing for a cache to repeat. In those cases, a low hit rate is the correct, expected state, and "just add caching" would be the wrong call entirely. In those cases, a low hit rate is the correct, expected state, and "just add caching" would be the wrong call entirely.
So the real finding is narrower than "low hit rate equals waste", and more useful. It's this: a high-throughput database, sitting behind a cache with a low hit rate, on a workload that should be repetitive. That gap between what should be cached and what actually is represents avoidable spend. Popular pages, common lookups, repeated reads: that traffic should almost never reach the database. When it does, the wrong layer is being scaled.
The question worth putting to a team isn't whether the database can handle the load. It's this: how much of what the database does every day is work it has already done before, and what's supposed to be catching that repetition before it ever gets there.
In this case, the answer was a cache that had been misconfigured for months, quietly passing through traffic it should have absorbed. Fixing the cache, not upgrading the database, was enough. The database never needed the upgrade it was about to get.
The specific causes for a cache misconfiguration can vary, but a few show up often. TTLs (time to live) are set too short, so entries expire and get re-fetched from the database before they're ever reused. Also, there might be cache keys built too granularly, including parameters like session IDs or timestamps that make two requests for the same page look like two different lookups, so nothing ever matches. Another cause is invalidation logic that clears far more than it needs to, wiping out perfectly good cached data on every write instead of just the affected keys. Or a code path that bypasses the cache entirely for a slice of traffic, often left over from a migration or a quick fix that never got revisited.
Therefore the pattern worth checking for before any database gets a bigger price tag is - is the cheap thing in front actually doing its job. It's one of the least glamorous, most consistently profitable questions a cloud bill can answer.
