تكرار السؤال: …
الإجابة المختصرة
خوارزمية تعيد حساب وتحديث الكاش في الخلفية بنسبة احتمالية تتصاعد كلما اقترب المفتاح من انتهاء صلاحيته، لضمان عدم وصول الكاش للصفر مطلقاً.
الشرح
عندما ينتهي كاش عنصر عالي الطلب (مثل الصفحة الرئيسية)، فإن مئات الطلبات ستجد الكاش مفقوداً وتنقض على قاعدة البيانات معاً (Cache Stampede / Dog-piling). بدلاً من القفل الصارم، تقوم هذه الخوارزمية (المعروفة بـ XFetch) بحساب قيمة عشوائية كلما قرأ طلب المفتاح في دقائقه الأخيرة؛ فإذا تحققت النسبة، يقوم هذا الطلب بتحديث الكاش بينما يحصل الجميع على نسخة سريعة دون أي توقف.
مثال بالكود
function rememberEarly(string $key, int $ttl, Closure $compute, float $beta = 1.0)
{
$entry = Cache::get($key); // ['value' => ..., 'delta' => seconds the computation took, 'expires' => timestamp]
$now = microtime(true);
// The closer to expiry (and the slower the computation), the likelier an early refresh
if ($entry === null || ($now - $entry['delta'] * $beta * log(mt_rand() / mt_getrandmax())) >= $entry['expires']) {
$start = microtime(true);
$value = $compute();
$entry = ['value' => $value, 'delta' => microtime(true) - $start, 'expires' => $now + $ttl];
Cache::put($key, $entry, $ttl * 2);
}
return $entry['value'];
}أخطاء شائعة
- الاعتماد على TTL ثابت فقط في المواقع الضخمة دون معالجة سيناريو لحظة الفناء المفاجئ للمفتاح.