Cache Stampede یا هجوم همزمان به کش، زمانی رخ می‌دهد که کلید پرطرفداری منقضی شود و تعداد زیادی درخواست همزمان بخواهند مقدار آن را از منبع اصلی بسازند.

فرض کنید قیمت سبد خرید کمپین فروشگاه در کش نگهداری می‌شود. اگر هزار درخواست همزمان کش میس دریافت کنند، پایگاه داده با هزار محاسبه تکراری روبه‌رو می‌شود.

راهکارهای رایج

راهکاراثرمحدودیت
قفل هنگام بازسازیفقط یک پردازش داده را می‌سازدمدیریت خرابی و زمان انقضای قفل لازم است
TTL Jitterزمان انقضای کلیدها را پراکنده می‌کندبه تنهایی هجوم به یک کلید را رفع نمی‌کند
Stale-While-Revalidateموقتاً نسخه قدیمی را نشان می‌دهد و بازسازی می‌کندبرای قیمت قطعی یا موجودی حساس مناسب نیست
Request Coalescingدرخواست‌های همزمان را به یک محاسبه وصل می‌کندمعمولاً داخل یک پروسس است

نمونه در لاراول

$product = Cache::remember('product:42', now()->addMinutes(5), fn () => Product::findOrFail(42));
// For high traffic, protect regeneration with Cache::lock().
$lock = Cache::lock('lock:product:42', 10);
if ($lock->get()) {
    try {
        Cache::put('product:42', Product::findOrFail(42), 300);
    } finally { $lock->release(); }
}

نکته فنی

قفل مانع پردازش تکراری می‌شود اما درخواست‌های دیگر باید راهبرد انتظار، پاسخ جایگزین یا استفاده از نسخه کمی قدیمی داشته باشند. قفل توزیع‌شده به بک‌اند سازگار نیاز دارد.

اصطلاحات مرتبط: کشینگ، کش اینولیدیشن، ردیس، دیستریبیوتد لاک، ریت لیمیتینگ.

برای بررسی راهکارهای قفل کش، زمان انقضای تصادفی و بازسازی پیش‌دستانه، مقاله روش‌های جلوگیری از Cache Stampede همراه با مثال در باورژن را مطالعه کنید.