Caching: تسريع الأداء وتقليل الحمل على قاعدة البيانات

Caching: تسريع الأداء وتقليل الحمل على قاعدة البيانات

2025-11-27 وقت القراءه : 2 دقائق

لماذا cashing مهم؟

إذا كان عندك بيانات تتكرر كثيراً (مثل قائمة المنتجات، أو بيانات المستخدم، أو إعدادات التطبيق)، مش لازم كل مرة تروح تجيبها من الـ Database. استخدم Cache لتخزينها في الذاكرة!


Cache Drivers المتاحة في Laravel

Laravel يدعم عدة Cache Drivers لتناسب احتياجات مختلفة:

1. Redis Cache (الأفضل للإنتاج)

Redis هو الخيار الأمثل للتطبيقات في مرحلة الإنتاج - سريع جداً، يدعم أنواع بيانات متقدمة، ويمكن استخدامه أيضاً للـ Queue والـ Session.

bash# تثبيت Redis
composer require predis/predis
env# في .env
CACHE_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
phpuse Illuminate\Support\Facades\Cache;


// تخزين بيانات في الـ Cache
Cache::put('products', $products, now()->addHours(1));


// استرجاع بيانات من الـ Cache
$products = Cache::get('products');


// Cache with remember (الأكثر استخداماً)
$products = Cache::remember('products', 3600, function () {
    return Product::with('category')->active()->get();
});


// تخزين دائم
Cache::forever('settings', $settings);


// حذف من الـ Cache
Cache::forget('products');


// مسح كل الـ Cache
Cache::flush();



2. Memcached

مناسب اذا كانكنت تحتاج فقط ل simple key-value caching، فهو بديل خفيف وسريع ل Redis

bash# تثبيت Memcached PECL extension
sudo apt-get install memcached
sudo apt-get install php-memcached
env
CACHE_DRIVER=memcached
MEMCACHED_HOST=127.0.0.1
MEMCACHED_PORT=11211


3. File Cache (للتطوير فقط)

env
CACHE_DRIVER=file

⚠️ ملاحظة: File cache غير مناسب للإنتاج لأنه بطيء نسبياً ولا يدعم الـ distributed caching.


استراتيجيات Caching متقدمة

Cache Tags (للتنظيم الأفضل)

php// تخزين مع tags
Cache::tags(['products', 'category:' . $categoryId])
    ->put('products:category:' . $categoryId, $products, 3600);


// استرجاع
$products = Cache::tags(['products', 'category:' . $categoryId])
    ->get('products:category:' . $categoryId);


// حذف كل cache items لـ tag معين
Cache::tags('products')->flush();


⚠️ تنبيه مهم: Cache tags تعمل بشكل أفضل مع Memcached. مع Redis قد تواجه مشاكل في الأداء.

Query Result Caching

php// في Model
public function scopePopular($query)
{
    return Cache::remember('popular_products', 3600, function () use ($query) {
        return $query->where('views', '>', 1000)
                    ->orderBy('views', 'desc')
                    ->limit(10)
                    ->get();
    });
}


// الاستخدام
$popularProducts = Product::popular()->get();


Response Caching للـ API

php// في Controller
public function index()
{
    return Cache::remember('api.products.index', 600, function () {
        $products = Product::with('category')->paginate(20);
        
        return response()->json([
            'data' => $products,
            'cached_at' => now()
        ]);
    });
}

Cache Invalidation عند التحديث

php// في Observer أو Event Listener
class ProductObserver
{
    public function saved(Product $product)
    {
        // حذف الـ cache عند حفظ منتج
        Cache::forget('products');
        Cache::forget('popular_products');
        Cache::tags('products')->flush();
    }
    
    public function deleted(Product $product)
    {
        Cache::forget('products');
    }
}


فوائد Caching

✅ سرعة فائقة: تقليل زمن الاستجابة من ثواني إلى ميلي ثانية

✅ تقليل الحمل: يوفر 70-90% من الاستعلامات على قاعدة البيانات

✅ قابلية التوسع: يمكن خدمة آلاف المستخدمين بنفس موارد السيرفر

✅ توفير التكاليف: تقليل استهلاك CPU والـ Database

إضافة تعليق
Loading...