Bilgi Bankası
RedisPerformans ve kapasite 15 dk 14.06.2026

Redis önbellek stampede: aynı anda expire olan keyler veritabanını nasıl yorar?

Önbellek keyleri aynı anda expire olduğunda, Redis boşluğu ana veritabanına yük olarak geri döner. Sorun Redis’in yavaş olması değil, önbellek’in aynı anda herkesi kapıya göndermesidir.

Bu yazı sana şu durumda yardımcı olur
  • belirli dakikalarda veritabanı trafiği aniden artıyor
  • önbellek hit oranı dalgalanıyor
  • popüler uç noktalarde p95 gecikme sıçrıyor
  • aynı key expire olunca birçok worker aynı sorguyu çalıştırıyor
  • TTL eklenmesine rağmen ana veritabanı korunmuyor
Yazıyı bitirince

Önbellek stampede belirtilerini tanıyacak, TTL jitter, request coalescing, lock ve stale-while-revalidate yaklaşımlarını ne zaman kullanacağınızı ayırabileceksiniz.

TürkDB açısından ürünleşme notu

Bu bölüm, TürkDB’nin ilgili problemi hangi ürün ilkeleri ve kontrol noktalarıyla ele alacağını anlatır. Kapsam, gerçek iş yükü ve ihtiyaçla birlikte netleşir.

TürkDB Redis’i izlenebilir ve yönetilebilir bir servis olarak ürünleştirmeyi hedefler; SLOWLOG ve bellek davranışını görünür kılmanın değeri pilotta ölçülmelidir. Ama stampede çözümü uygulama önbellek stratejisinde, yani key üretimi ve yenileme akışında başlar.

Stampede neden olur?

Bir popüler key expire olduğunda yüzlerce istek aynı anda önbellek miss alabilir. Hepsi ana veritabanına giderse Redis’in amacı tersine döner: sistemi korumak yerine dalga halinde yük bindirir.

Bu durum özellikle ana sayfa konfigürasyonu, fiyat listesi, kampanya bilgisi, ürün katalogları ve tenant bazlı ayar keylerinde sık görülür.

  • Aynı TTL ile yazılan çok sayıda key aynı anda expire olur.
  • Popüler tek key expire olduğunda herkes aynı sorguyu çalıştırır.
  • Önbellek miss sonrası yeniden hesaplama pahalıdır.
  • Worker sayısı arttıkça aynı miss daha fazla yük üretir.

TTL jitter dalgayı yumuşatır

En basit önlem, TTL değerine küçük bir rastgelelik eklemektir. Böylece aynı anda yazılan keyler aynı saniyede expire olmaz. Bu tek başına her şeyi çözmez ama ani yük dalgasını azaltır.

TTL jitter örneği

redis-ttl-jitter.ts
const baseTtlSeconds = 300
const jitterSeconds = Math.floor(Math.random() * 90)

await redis.set(önbellekKey, JSON.stringify(value), {
  EX: baseTtlSeconds + jitterSeconds,
})

Tek key için tek yeniden hesaplama yapın

Popüler bir key expire olduğunda tüm workerların aynı pahalı sorguyu çalıştırması yerine, bir worker yeniden hesaplama yaparken diğerleri bekleyebilir veya eski değeri kısa süre kullanabilir.

Distributed lock dikkatli kullanılmalıdır. Lock süresi kısa, hata durumunda güvenli ve ana işi bloke etmeyecek şekilde tasarlanmalıdır.

Basit request coalescing fikri

redis-cache-lock.ts
const cached = await redis.get(önbellekKey)
if (cached) return JSON.parse(cached)

const lockKey = `lock:${önbellekKey}`
const locked = await redis.set(lockKey, "1", { NX: true, EX: 10 })

if (locked) {
  const fresh = await loadFromDatabase()
  await redis.set(önbellekKey, JSON.stringify(fresh), { EX: 300 })
  await redis.del(lockKey)
  return fresh
}

await sleep(100)
const retried = await redis.get(önbellekKey)
if (retried) return JSON.parse(retried)

return loadFromDatabase()

Stale veri bazen doğru takastır

Her veri milisaniye güncel olmak zorunda değildir. Kampanya listesi veya katalog özetinde birkaç saniyelik stale veri kabul edilebiliyorsa stale-while-revalidate yaklaşımı kullanıcı deneyimini korur.

Bu karar teknik değil ürün kararıdır. Ödeme, stok veya yetki gibi kritik alanlarda stale veri tehlikeli olabilir; katalog, ayar ve rapor özetlerinde kabul edilebilir.

Devam etmek istersen

Sorunu motor bazında derinleştirin

Benzer belirtiler farklı motorlarda farklı nedenlere dayanır; yayınlanan tüm rehberleri ana sayfadan takip edebilirsiniz.

Tüm makaleler