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
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
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.