Redis TTL, Jitter, and How I Almost Crashed a Server šŸš€

Redis TTL, Jitter, and How I Almost Crashed a Server šŸš€

Recently, I ran into an interesting Redis case that taught me a big lesson Infinite cache TTLs are like hoarding—things pile up until it’s a problem.

18th Sep 2025

Redis TTL, Jitter, and How I Almost Crashed a Server šŸš€

Recently, I ran into an interesting Redis case that taught me a big lesson: Infinite cache TTLs are like hoarding—things pile up until it’s a problem.


The Setup: Infinite Cache

Once upon a time (okay, just a few months ago), we were saving some data in Redis with no expiration. The idea was simple:

  • Data comes from another system (the real source of truth).
  • We cache it in Redis for fast access.
  • Done. Easy. āœ…

But here’s the problem: when you never expire cache, it keeps growing. And growing. And growing. Like that drawer in your house where you throw every cable you’ve ever owned.

The Task: Add a TTL

One day, I got the task:

ā€œPlease set a TTL of two weeks for this cache.ā€

Sounds easy, right? Just add:

redis.set('mykey', value, 'EX', 1209600) // 2 weeks in seconds

Boom. Done. Task finished. Go get coffee. ā˜•

Except… not really.

The Problem: Cache Avalanche

Think about what happens two weeks later. Every single cached key expires at the same time.

Suddenly, Redis says:

ā€œSorry boss, no cache here!ā€

And then our poor backend server (the real source of truth) gets flooded with requests, like:

HELP! SEND DATA! SEND DATA! SEND DATA!

The server could literally crash under the unexpected load. This is called a cache avalanche.

The Solution: Add Jitter

The trick is simple but powerful: don’t let all keys expire at once.

Instead of setting exactly 2 weeks, we add a little randomness (aka jitter). For example:

// Expire between 14 and 16 days
const baseTTL = 14 * 24 * 60 * 60 // 14 days
const jitter = Math.floor(Math.random() * (2 * 24 * 60 * 60)) // up to 2 days
const ttl = baseTTL + jitter

redis.set('mykey', value, 'EX', ttl)

Now some keys expire in 14 days, some in 15, some in 16. Which means requests trickle back to the server instead of hitting it like a tsunami. 🌊

Why It Matters

Without jitter:

  • Day 14 → server gets millions of requests at once. Boom. šŸ”„

With jitter:

  • Day 14 → some requests
  • Day 15 → some more
  • Day 16 → a few more
  • Server is chill. šŸ˜Ž

This small change can save your entire system from crashing.

Final Thoughts

Caching is powerful, but it comes with hidden gotchas.

  • Infinite TTL? Your cache becomes a junkyard.
  • Fixed TTL? Your server might collapse in 14 days like a time bomb.
  • TTL with jitter? Balanced, safe, and production-ready.

So the next time you set a cache TTL, remember: šŸ‘‰ Always sprinkle some randomness in your Redis life.

Your future self (and your backend servers) will thank you. šŸ™

Do you want me to also add a diagram (ASCII or image idea) showing the difference between no jitter vs jitter so it’s more visually clear for the blog?