⚡ درس ششم: کار با Redis و Caching؛ افزایش چشمگیر سرعت سایت
🎯 هدف این درس: آشنایی با مفهوم کشینگ (Caching)، نصب و پیکربندی Redis در PHP، ذخیرهسازی دادههای پرتکرار در حافظه رم و کاهش بار دیتابیس برای افزایش سرعت پاسخدهی سایت.
مهمان عزیز! 👋
تا اینجا یاد گرفتی چطور کدهای تمیز بنویسی و آنها را تست کنی. اما وقتی ترافیک سایت بالا میرود، حتی بهترین کدها هم ممکن است کند شوند. دلیل اصلی؟ دیتابیس!
هر بار که کاربری صفحهای را باز میکند، اجرای کوئریهای SQL زمانبر است. راه حل حرفهای این است که نتایج پرتکرار را به جای خواندن از دیسک (دیتابیس)، در حافظه رم (RAM) نگه داریم. اینجاست که Redis وارد میدان میشود.
💡 چرا Redis؟
Redis یک پایگاه داده Key-Value در حافظه است که سرعت خواندن/نوشتن آن هزاران برابر سریعتر از MySQL است. استفاده صحیح از آن میتواند زمان پاسخدهی API یا صفحات سایت را از چند صد میلیثانیه به چند میلیثانیه کاهش دهد.
1️⃣ اتصال به Redis در PHP
برای کار با Redis در PHP، باید اکستنشن php-redis روی سرور نصب باشد. سپس میتوانیم به سادگی به آن متصل شویم.
redis_connect.php
PHP
8.x
<?php
$redis = new Redis();
try {
// اتصال به سرور Redis (پیشفرض پورت 6379)
$redis->connect('127.0.0.1', 6379);
// بررسی وضعیت اتصال
echo "✅ متصل به Redis: " . $redis->ping();
} catch (RedisException $e) {
die("❌ خطا در اتصال: " . $e->getMessage());
}
2️⃣ الگوی Cache-Aside (کش کردن دادههای دیتابیس)
رایجترین الگو این است: اول چک کن داده در کش هست؟ اگر بود برگردان. اگر نبود، از دیتابیس بگیر، در کش ذخیره کن و بعد برگردان.
cached_query.php
PHP
8.x
<?php
$cacheKey = 'user_profile_100';
// ۱. تلاش برای دریافت از کش
$cachedData = $redis->get($cacheKey);
if ($cachedData) {
$user = json_decode($cachedData, true);
echo "🟢 داده از کش خوانده شد";
} else {
// ۲. دریافت از دیتابیس (شبیهسازی)
$user = ['id' => 100, 'name' => 'Younes'];
// ۳. ذخیره در کش به مدت ۱ ساعت (3600 ثانیه)
$redis->setex($cacheKey, 3600, json_encode($user));
echo "🔴 داده از دیتابیس خوانده و کش شد";
}
3️⃣ مدیریت انقضای کش (TTL) و حذف دستی
همیشه برای دادههای کش TTL (زمان انقضا) تعیین کن تا حافظه پر نشود. همچنین وقتی دادهای در دیتابیس آپدیت میشود، حتماً کش مربوط به آن را پاک کن.
invalidate_cache.php
PHP
8.x
<?php
// وقتی پروفایل کاربر ۱۰۰ آپدیت شد:
$userId = 100;
// آپدیت در دیتابیس...
// حذف کش قدیمی تا درخواست بعدی داده جدید را بگیرد
$redis->del("user_profile_$userId");
echo "✅ کش کاربر $userId با موفقیت پاک شد.";
❌ خطاهای رایج در استفاده از Redis
🚫 اشتباه مرگبار:
ذخیره دادههای حساس مثل رمز عبور یا توکنهای بانکی در Redis بدون رمزنگاری. Redis به صورت پیشفرض دادهها را رمزنگاری نمیکند.
- فراموش کردن Invalidation: اگر وقتی داده عوض میشود کش را پاک نکنی، کاربران دادههای قدیمی میبینند.
- کلیدهای نامشخص: از کلیدهایی مثل
user:100:profileاستفاده کن نه فقطuser. ساختاردهی کلیدها حیاتی است. - عدم تعیین TTL: دادههای بدون انقضا به مرور حافظه سرور را پر کرده و باعث کرش سرویس میشوند.
🏁 جمعبندی درس ششم
مهمان عزیز، در این درس یاد گرفتی:
- ✅ تفاوت کشینگ در حافظه (Redis) و دیتابیس سنتی.
- ✅ نحوه اتصال به Redis و انجام عملیات پایه (Get/Set).
- ✅ پیادهسازی الگوی Cache-Aside برای کوئریهای سنگین.
- ✅ اهمیت تعیین TTL و استراتژی پاکسازی کش.
🎓 تمرین عملی درس ششم
یک اسکریپت بنویس که لیست ۱۰ محصول پرفروش را از دیتابیس بگیرد و به مدت ۵ دقیقه در Redis کش کند. سپس یک دکمه “بروزرسانی محصولات” بساز که با کلیک روی آن، کش مربوطه پاک شود.
🗺️ نقشه راه دوره: شما اینجا هستید!
برای اینکه بدانی دقیقاً کجای مسیر هستی و چه درسهایی در انتظار توست، به جدول زیر نگاه کن. درس فعلی با رنگ متفاوت مشخص شده است.
| درس | عنوان درس | آنچه یاد میگیرید |
|---|---|---|
| ۱ | اصول SOLID در PHP | تکمسئولیتی، باز/بسته، جایگزینی لیسکوف، جداسازی رابط، وارونگی وابستگی |
| ۲ | الگوهای طراحی (Design Patterns) | Singleton, Factory, Strategy, Observer, MVC پیشرفته |
| ۳ | برنامهنویسی تابعی در PHP | توابع ناشناس (Closures)، Arrow Functions، Map/Filter/Reduce |
| ۴ | مدیریت وابستگی با Composer | نصب پکیجها، مدیریت نسخهها، Autoloading (PSR-4) |
| ۵ | تستنویسی حرفهای (TDD) | آشنایی با PHPUnit، نوشتن Unit Test، Mocking |
| ۶ | کار با Redis و Caching | کش کردن دادهها، Session Handler با Redis |
| ۷ | پردازشهای پسزمینه (Queue & Jobs) | استفاده از صفها برای ایمیلزنی یا پردازش سنگین |
| ۸ | API نویسی حرفهای (RESTful) | استانداردهای REST، احراز هویت با JWT، Rate Limiting |
| ۹ | امنیت سایبری پیشرفته | تحلیل حملات پیچیده، Secure Headers، CSP |
| ۱۰ | پروژه نهایی پیشرفته | ساخت یک CMS ماژولار با قابلیت نصب پلاگین و تم |



