سی ام اس نویسسی ام اس نویسیاد بگیر، سیستم خودتو بنویس
مجلهتماس با ما
سی ام اس نویسسی ام اس نویس

CMS نویس مرجعی برای آموزش برنامه نویسی وب و PHP، توسعه افزونه‌های اختصاصی وردپرس، طراحی ورک‌فلو و اتوماسیون با n8n و توسعه CMS های اختصاصی است. هدف ما ارائه آموزش‌های کاربردی و راهکارهای حرفه‌ای برای توسعه‌دهندگان، کسب‌وکارها و علاقه‌مندان به دنیای برنامه‌نویسی است.

پیوندهای سریع
محصولات فیزیکیمحصولات دیجیتالدوره‌های آموزشی
سی ام اس نویس
مجله سی ام اس نویستماس با ماپنل کاربری
سی ام اس نویس — تمامی حقوق برای سی ام اس نویس محفوظ است. © 1406 تماس با ما09307711941
Cache در Laravel چیست؟ آموزش کامل کش در لاراول

Cache در Laravel چیست؟ آموزش کامل کش در لاراول

ممدیر کل سیستم ۱۵ مهر ۱۴۰۵ ۲۰ دقیقه مطالعه ۱ بازدید
Cache در Laravel چیست؟ آموزش کامل کش در لاراول

وقتی یک پروژه Laravel کوچک است، معمولاً اجرای مستقیم Queryهای دیتابیس مشکل خاصی ایجاد نمی‌کند. اما با افزایش تعداد کاربران و درخواست‌ها، شرایط تغییر می‌کند.

فرض کنید صفحه‌ای دارید که در هر درخواست اطلاعات زیر را از دیتابیس دریافت می‌کند:

  • لیست دسته‌بندی‌ها
  • تنظیمات سایت
  • محصولات محبوب
  • آخرین مقالات
  • اطلاعات آماری
  • منوهای سایت

اگر این اطلاعات در هر درخواست دوباره از دیتابیس خوانده شوند، تعداد Queryها به‌مرور افزایش پیدا می‌کند و فشار بیشتری به Database وارد می‌شود.

اینجاست که Cache وارد معماری برنامه می‌شود.

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

Laravel یک سیستم Cache قدرتمند و استاندارد دارد که می‌تواند با Storeهای مختلفی مانند File، Database و Redis کار کند.

در این مقاله از صفر با Cache در Laravel آشنا می‌شویم و در ادامه نحوه استفاده صحیح از آن در پروژه‌های واقعی را بررسی می‌کنیم.


Cache چیست؟

Cache یا کش، محلی برای نگهداری موقت داده‌هایی است که احتمال دارد دوباره مورد استفاده قرار بگیرند.

هدف اصلی Cache این است که از انجام دوباره عملیات‌های پرهزینه جلوگیری کند.

برای مثال فرض کنید اجرای این Query زمان‌بر باشد:


$products = Product::where('status', 'active')

    ->latest()

    ->take(20)

    ->get();

اگر این Query در هر درخواست اجرا شود، دیتابیس باید بارها همان اطلاعات را پردازش کند.

اما می‌توان نتیجه را Cache کرد:


Request

   ↓

Cache

   ↓

داده وجود دارد؟

   ├── بله → استفاده از Cache

   │

   └── خیر

        ↓

      Database

        ↓

      ذخیره در Cache

        ↓

      Response

در نتیجه درخواست‌های بعدی می‌توانند بدون اجرای دوباره Query از داده Cache شده استفاده کنند.


# چرا Cache در Laravel مهم است؟

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

فرض کنید یک Query سنگین دارید که 300 میلی‌ثانیه زمان می‌برد.

اگر این Query در هر درخواست اجرا شود:


1000 Request

×

300ms Query

می‌تواند فشار زیادی به Database وارد کند.

اما اگر نتیجه برای چند دقیقه Cache شود، بسیاری از درخواست‌ها بدون اجرای دوباره Query پاسخ داده می‌شوند.

در این حالت:


Request

   ↓

Cache

   ↓

Response

به همین دلیل Cache یکی از ابزارهای مهم در بهینه‌سازی Application است.


# Cache در Laravel چگونه کار می‌کند؟

Laravel یک API یکپارچه برای Cache در اختیار توسعه‌دهنده قرار می‌دهد.

یعنی شما معمولاً لازم نیست در تمام قسمت‌های برنامه بدانید داده دقیقاً در کجا ذخیره شده است.

برای مثال:


use Illuminate\Support\Facades\Cache;



Cache::put('site_name', 'CMSNevis', 3600);

برای دریافت:


$siteName = Cache::get('site_name');

اگر بعداً تصمیم بگیرید Store مربوط به Cache را تغییر دهید، کد Application تا حد زیادی بدون تغییر باقی می‌ماند.

این یکی از مزیت‌های مهم سیستم Cache لاراول است.


# Cache Store چیست؟

Cache Store مشخص می‌کند داده‌های Cache در کجا ذخیره شوند.

Laravel می‌تواند با Storeهای مختلفی کار کند.

برخی گزینه‌های رایج عبارت‌اند از:

Storeمحل ذخیره
Fileفایل‌های روی سرور
Databaseجدول دیتابیس
RedisRedis
MemcachedMemcached
Arrayحافظه موقت Application

انتخاب Store به نیاز پروژه بستگی دارد.

برای یک پروژه کوچک ممکن است File Cache کافی باشد.

برای یک پروژه بزرگ‌تر ممکن است Redis انتخاب مناسب‌تری باشد.


# File Cache در Laravel

File Cache یکی از ساده‌ترین روش‌های ذخیره Cache است.

در این روش اطلاعات Cache به‌صورت فایل در Storage مربوط به Laravel ذخیره می‌شوند.

مزیت اصلی File Cache این است که برای استفاده از آن معمولاً به سرویس جداگانه‌ای مانند Redis نیاز ندارید.

بنابراین برای پروژه‌های کوچک یا محیط Development می‌تواند گزینه مناسبی باشد.

اما برای پروژه‌های بزرگ و پرترافیک، معمولاً باید گزینه‌های مناسب‌تری را بررسی کرد.


# Database Cache در Laravel

در Database Cache اطلاعات Cache داخل Database ذخیره می‌شوند.

این روش زمانی می‌تواند مفید باشد که نمی‌خواهید سرویس جداگانه‌ای مثل Redis راه‌اندازی کنید.

اما باید توجه داشت که Cache کردن داده در همان Database اصلی همیشه به معنی کاهش فشار روی Database نیست.

اگر هدف اصلی شما کاهش بار دیتابیس است، استفاده از Database به‌عنوان Cache ممکن است آن نتیجه‌ای را که انتظار دارید ایجاد نکند.


# Redis Cache در Laravel

Redis یکی از گزینه‌های محبوب برای Cache در پروژه‌های Laravel است.

Redis اطلاعات را عمدتاً در حافظه نگهداری می‌کند و برای عملیات سریع روی داده‌ها بسیار مناسب است.

معماری معمول:


Laravel

   │

   ├── MySQL

   │

   └── Redis

        └── Cache

در مقاله قبلی درباره Redis در Laravel به‌صورت کامل درباره اتصال Laravel به Redis و کاربردهای آن صحبت کردیم.

در این مقاله تمرکز ما روی API مربوط به Cache است.


# تنظیم Cache Store در Laravel

در پروژه‌های Laravel جدید می‌توانید Store مربوط به Cache را از طریق Environment تنظیم کنید.

برای مثال:


CACHE_STORE=redis

یا بسته به معماری پروژه می‌توانید Store دیگری را انتخاب کنید.

تنظیمات دقیق Storeها در Configuration مربوط به Cache پروژه قرار دارد.

اگر تنظیمات .env را تغییر دادید و Laravel همچنان مقدار قبلی را استفاده کرد، Configuration Cache را بررسی کنید:


php artisan config:clear

در Production نیز پس از اطمینان از تنظیمات می‌توانید Configuration را Cache کنید:


php artisan config:cache


# Cache::put در Laravel

یکی از ساده‌ترین روش‌های ذخیره داده در Cache، استفاده از put است.


use Illuminate\Support\Facades\Cache;



Cache::put('site_name', 'CMSNevis', 3600);

در این مثال:


Key:

site_name



Value:

CMSNevis



TTL:

3600 seconds

پس مقدار موردنظر برای مدت مشخصی در Cache ذخیره می‌شود.


# TTL چیست؟

TTL مخفف:

Time To Live

است.

TTL مشخص می‌کند یک داده چه مدت در Cache باقی بماند.

مثلاً:


Cache::put('site_name', 'CMSNevis', 3600);

یعنی Cache برای این داده یک زمان انقضا در نظر گرفته شده است.

TTL برای داده‌هایی که ممکن است تغییر کنند اهمیت زیادی دارد.

برای مثال:


تنظیمات سایت → TTL طولانی

قیمت محصول → TTL کوتاه‌تر

آمار لحظه‌ای → TTL بسیار کوتاه

مدت مناسب TTL به نوع داده بستگی دارد.


# Cache::get در Laravel

برای دریافت داده از Cache:


$value = Cache::get('site_name');

اگر کلید وجود داشته باشد، مقدار آن برگردانده می‌شود.

اگر وجود نداشته باشد، نتیجه معمولاً null خواهد بود.

می‌توانید مقدار پیش‌فرض هم مشخص کنید:


$value = Cache::get('site_name', 'Default Name');

در این حالت اگر site_name وجود نداشته باشد، مقدار Default Name برگردانده می‌شود.


# بررسی وجود Cache با has

اگر فقط می‌خواهید بدانید یک Cache وجود دارد یا خیر:


if (Cache::has('site_name')) {

    // Cache exists

}

این روش برای بررسی وجود یک کلید مفید است.


# حذف Cache با forget

برای حذف یک مقدار:


Cache::forget('site_name');

این عملیات زمانی بسیار مهم است که داده اصلی تغییر کرده باشد.

مثلاً:


$product->update($data);



Cache::forget('product:' . $product->id);

در اینجا بعد از تغییر محصول، Cache قبلی آن حذف می‌شود.


# پاک کردن تمام Cache

در شرایط خاص ممکن است بخواهید Cache مربوط به Application را پاک کنید.

برای مدیریت Cacheهای Laravel می‌توانید از Artisan استفاده کنید:


php artisan cache:clear

اما نباید از پاک کردن کل Cache به‌عنوان راه‌حل همیشگی برای مشکلات Application استفاده کنید.

اگر مشکل از Configuration باشد، بهتر است Configuration Cache را مدیریت کنید:


php artisan config:clear

اگر مشکل از Route Cache باشد:


php artisan route:clear

و برای View Cache:


php artisan view:clear

هر Cache باید متناسب با نوع خودش مدیریت شود.


# Cache::remember چیست؟

یکی از مهم‌ترین و کاربردی‌ترین متدهای Cache در Laravel، remember است.

این متد برای سناریوی زیر بسیار مناسب است:

> اگر داده در Cache وجود دارد، آن را برگردان؛ اگر وجود ندارد، داده را تولید کن، ذخیره کن و برگردان.

مثلاً:


$products = Cache::remember('products', 3600, function () {

    return Product::latest()->get();

});

Laravel ابتدا Cache را بررسی می‌کند.

اگر products وجود داشته باشد:


Cache

 ↓

Return

اگر وجود نداشته باشد:


Cache

 ↓

Not Found

 ↓

Database

 ↓

Store in Cache

 ↓

Return

این الگو یکی از پرکاربردترین روش‌های Cache کردن Queryهای Laravel است.


# Cache::remember در یک پروژه واقعی

فرض کنید یک سایت خبری دارید.

در صفحه اصلی آخرین 10 مقاله نمایش داده می‌شوند:


$posts = Cache::remember('homepage:posts', 600, function () {

    return Post::query()

        ->where('status', 'published')

        ->latest('published_at')

        ->take(10)

        ->get();

});

در این مثال:


Cache Key:

homepage:posts



TTL:

600 seconds

در نتیجه Query فقط زمانی اجرا می‌شود که Cache وجود نداشته باشد یا منقضی شده باشد.


# Cache::rememberForever

برای داده‌هایی که به‌ندرت تغییر می‌کنند، می‌توان از Cache دائمی استفاده کرد:


$settings = Cache::rememberForever('site:settings', function () {

    return SiteSetting::all();

});

اما عبارت «دائمی» را نباید به معنای ذخیره همیشگی و بدون مدیریت در نظر گرفت.

اگر داده‌ای با rememberForever ذخیره شود، باید هنگام تغییر داده اصلی Cache آن را به‌صورت دستی پاک یا بازسازی کنید.

مثلاً:


SiteSetting::update($data);



Cache::forget('site:settings');


# Cache::add چیست؟

گاهی می‌خواهیم یک مقدار فقط زمانی ذخیره شود که کلید موردنظر از قبل وجود نداشته باشد.

برای این کار می‌توان از add استفاده کرد:


Cache::add('process:lock', true, 60);

اگر کلید از قبل وجود داشته باشد، مقدار جدید جایگزین نمی‌شود.

این قابلیت در بعضی سناریوهای هماهنگ‌سازی و جلوگیری از اجرای تکراری عملیات مفید است.


# افزایش و کاهش مقدار Cache

Laravel امکان کار با مقادیر عددی Cache را نیز فراهم می‌کند.

برای افزایش:


Cache::increment('page_views');

برای افزایش با مقدار مشخص:


Cache::increment('page_views', 5);

و برای کاهش:


Cache::decrement('page_views');

این قابلیت برای شمارنده‌هایی مانند تعداد بازدید، تعداد عملیات یا بعضی آمارهای موقت کاربرد دارد.


# Cache Key چیست؟

هر داده Cache شده با یک Key شناسایی می‌شود.

مثلاً:


products

یا:


product:25

یا:


category:12:products

انتخاب Key مناسب بسیار مهم است.

برای پروژه‌های بزرگ بهتر است یک الگوی مشخص داشته باشید.

مثلاً:


product:{id}

category:{id}:products

user:{id}:profile

homepage:latest-products

settings:site

این ساختار باعث می‌شود مدیریت Cache بسیار ساده‌تر شود.


# چرا Cache Key خوب مهم است؟

فرض کنید کلیدهای پروژه شما این شکلی باشند:


data1

data2

data3

test

cache1

newdata

بعد از مدتی مشخص نیست هر کلید مربوط به چه چیزی است.

اما اگر از ساختار مشخص استفاده کنید:


product:15

product:20

category:5:products

user:10:permissions

به‌راحتی می‌توان فهمید هر Cache مربوط به چه بخشی است.


# Cache Invalidation چیست؟

یکی از مهم‌ترین مفاهیم در سیستم‌های Cache، Cache Invalidation است.

به زبان ساده:

> چه زمانی باید Cache قبلی را حذف یا به‌روزرسانی کنیم؟

فرض کنید محصولی در دیتابیس داریم:


Product #25

Price = 500,000

قیمت محصول در Cache هم ذخیره شده است.

حالا قیمت در Database تغییر می‌کند:


Database:

700,000



Cache:

500,000

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

بنابراین بعد از تغییر داده باید سیاست مشخصی برای Cache داشته باشید.


# یک مثال صحیح برای Cache Invalidation

فرض کنید اطلاعات محصول را Cache کرده‌ایم:


$product = Cache::remember(

    'product:' . $id,

    3600,

    fn () => Product::findOrFail($id)

);

وقتی محصول تغییر می‌کند:


$product->update($data);



Cache::forget('product:' . $product->id);

در درخواست بعدی:


Cache

 ↓

Not Found

 ↓

Database

 ↓

New Data

 ↓

Cache

به این ترتیب داده جدید دوباره Cache می‌شود.


# Cache کردن Queryهای Eloquent

یکی از رایج‌ترین کاربردهای Cache در Laravel، Cache کردن نتیجه Queryهای Eloquent است.

مثلاً:


$categories = Cache::remember(

    'categories:active',

    3600,

    fn () => Category::where('active', true)->get()

);

این روش مخصوصاً برای داده‌هایی مناسب است که:

  • زیاد خوانده می‌شوند
  • کم تغییر می‌کنند
  • تولید آنها هزینه دارد

# چه چیزهایی را نباید Cache کنیم؟

هر داده‌ای الزاماً گزینه مناسبی برای Cache نیست.

مثلاً اگر داده‌ای:

  • دائماً تغییر می‌کند
  • حجم بسیار زیادی دارد
  • فقط یک بار استفاده می‌شود
  • تولید آن بسیار ارزان است

ممکن است Cache کردن آن ارزش خاصی نداشته باشد.

مثلاً اگر یک Query بسیار ساده دارید:


$user = User::find($id);

و فقط در یک بخش محدود از Application استفاده می‌شود، Cache کردن آن الزاماً تصمیم خوبی نیست.

Cache باید برای کاهش هزینه واقعی استفاده شود، نه صرفاً به این دلیل که امکان Cache کردن داده وجود دارد.


# چه داده‌هایی برای Cache مناسب هستند؟

معمولاً داده‌های زیر گزینه‌های خوبی هستند:

تنظیمات سایت


site settings

دسته‌بندی‌ها


categories

منوها


menus

داده‌های پرتکرار


popular products

popular posts

Queryهای سنگین


complex reports

statistics

aggregations

داده‌های کم‌تغییر


configuration

permissions

metadata


# Cache کردن API Response

Cache فقط مخصوص Query دیتابیس نیست.

اگر یک API خارجی را فراخوانی می‌کنید و نتیجه برای چند دقیقه قابل استفاده است، می‌توانید Response را Cache کنید.

مثلاً:


$data = Cache::remember('currency:rates', 300, function () {

    return Http::get('https://example.com/api/rates')

        ->json();

});

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

Cache می‌تواند این مشکل را کاهش دهد.


# Cache کردن اطلاعات سرویس‌های خارجی

این روش برای مواردی مانند:

  • نرخ ارز
  • آب‌وهوا
  • اطلاعات APIهای خارجی
  • داده‌های عمومی
  • اطلاعات سرویس‌های Third-party

بسیار کاربردی است.

البته TTL باید با میزان تغییرپذیری داده هماهنگ باشد.


# Cache و N+1 Query

Cache و N+1 Query دو موضوع متفاوت هستند.

Cache نمی‌تواند جای اصلاح Queryهای بد را بگیرد.

مثلاً اگر کد شما دچار N+1 Query باشد، بهتر است ابتدا مشکل Query را با روش‌هایی مانند Eager Loading حل کنید:


$orders = Order::with('user')->get();

بعد اگر همین Query هنوز پرتکرار یا پرهزینه بود، می‌توانید Cache را نیز بررسی کنید.

بنابراین ترتیب منطقی می‌تواند این باشد:


Optimize Query

      ↓

Fix N+1

      ↓

Add Index

      ↓

Measure Performance

      ↓

Cache if needed


# Cache و Eloquent

Cache می‌تواند در کنار Eloquent بسیار قدرتمند باشد.

مثلاً:


$products = Cache::remember(

    'products:featured',

    1800,

    fn () => Product::where('featured', true)

        ->where('status', 'active')

        ->latest()

        ->get()

);

اما باید توجه داشته باشید که Cache کردن Collectionهای بسیار بزرگ می‌تواند مصرف حافظه را افزایش دهد.

پس حجم داده Cache شده نیز اهمیت دارد.


# Cache کردن داده‌های بزرگ

فرض کنید می‌خواهید چند صد هزار رکورد را Cache کنید.

این کار معمولاً ایده خوبی نیست.

Cache برای نگهداری سریع داده است، نه اینکه یک دیتابیس دوم بسازیم.

بهتر است:

  • فقط داده موردنیاز را Cache کنید
  • Pagination داشته باشید
  • داده‌های پرتکرار را Cache کنید
  • TTL منطقی انتخاب کنید
  • حجم Cache را کنترل کنید

# Cache Tags چیست؟

در بعضی Cache Storeها امکان استفاده از Cache Tags وجود دارد.

مثلاً می‌توانید Cacheهای مربوط به محصولات را با یک Tag مشخص کنید.

ایده کلی:


Cache::tags(['products'])->put(

    'product:25',

    $product,

    3600

);

سپس می‌توانید Cacheهای مرتبط با آن Tag را مدیریت کنید.

این قابلیت برای سیستم‌هایی که Cacheهای زیادی دارند می‌تواند مفید باشد.

اما باید توجه داشت که همه Cache Storeها تمام قابلیت‌ها را به یک شکل پشتیبانی نمی‌کنند.

بنابراین قبل از طراحی معماری خود، Store موردنظر را بررسی کنید.


# Cache و چند سرور Laravel

فرض کنید Application شما روی چند Server اجرا می‌شود:


             Load Balancer

                  │

        ┌─────────┼─────────┐

        ↓         ↓         ↓

     Server 1  Server 2  Server 3

        │         │         │

        └─────────┼─────────┘

                  ↓

                Redis

اگر هر Server Cache محلی خودش را داشته باشد، ممکن است Cacheها با یکدیگر هماهنگ نباشند.

برای چنین معماری‌هایی معمولاً استفاده از یک Cache Store مشترک مانند Redis می‌تواند مناسب‌تر باشد.

این موضوع یکی از دلایل مهم استفاده از Redis در پروژه‌های بزرگ Laravel است.


# Cache و Deployment

یکی از مواردی که در Production باید به آن توجه کنید، Cacheهای Laravel است.

بعد از Deployment ممکن است نیاز باشد Configuration، Route یا Viewهای Cache شده مدیریت شوند.

برخی دستورات رایج:


php artisan config:clear

php artisan route:clear

php artisan view:clear

php artisan cache:clear

همچنین برای ساخت Cacheهای مناسب Production:


php artisan config:cache

php artisan route:cache

php artisan view:cache

باید دقت کنید که این دستورات با توجه به فرآیند Deployment پروژه استفاده شوند و نباید بدون شناخت محیط Production به‌صورت تصادفی اجرا شوند.


# اشتباهات رایج در استفاده از Cache

1. Cache کردن همه چیز

بیشتر Cache همیشه به معنی Performance بیشتر نیست.

Cache اضافی باعث افزایش پیچیدگی و مصرف منابع می‌شود.


2. نداشتن TTL مناسب

اگر Cache برای مدت بسیار طولانی باقی بماند، ممکن است داده قدیمی نمایش داده شود.


3. فراموش کردن Invalidation

یکی از رایج‌ترین مشکلات Cache همین است.

داده اصلی تغییر می‌کند اما Cache قدیمی باقی می‌ماند.


4. Cache کردن داده بسیار بزرگ

این کار می‌تواند RAM یا Storage را بی‌دلیل مصرف کند.


5. استفاده از Cache به جای Database

Cache نباید بدون دلیل تبدیل به منبع اصلی داده شود.


6. Cache کردن Queryهای ضعیف به جای اصلاح آنها

اگر Query مشکل دارد، اول Query را اصلاح کنید.

Cache نباید پوششی برای معماری ضعیف Database باشد.


# یک مثال کامل از Cache در Laravel

فرض کنید در فروشگاه خود لیست محصولات پرفروش را داریم.

بدون Cache:


$products = Product::query()

    ->where('status', 'active')

    ->orderByDesc('sales_count')

    ->take(10)

    ->get();

هر بار Query اجرا می‌شود.

حالا آن را Cache می‌کنیم:


$products = Cache::remember(

    'products:bestsellers',

    1800,

    fn () => Product::query()

        ->where('status', 'active')

        ->orderByDesc('sales_count')

        ->take(10)

        ->get()

);

اکنون جریان به این شکل است:


Request

   ↓

products:bestsellers

   ↓

┌───────────────────┐

│ Cache موجود است؟  │

└─────────┬─────────┘

          │

     ┌────┴────┐

     │         │

    Yes        No

     │         │

     ↓         ↓

  Return    Database

               ↓

             Cache

               ↓

             Return

اگر اطلاعات محصولات تغییر کند:


Cache::forget('products:bestsellers');

در درخواست بعدی داده جدید ساخته و Cache می‌شود.


# Cache در پروژه‌های فروشگاهی

Cache در فروشگاه‌های اینترنتی کاربرد بسیار زیادی دارد.

برای مثال می‌توان موارد زیر را Cache کرد:


لیست دسته‌بندی‌ها

منوی فروشگاه

محصولات ویژه

محصولات پرفروش

تنظیمات فروشگاه

اطلاعات صفحات عمومی

نتایج Queryهای سنگین

اطلاعات APIهای خارجی

اما اطلاعاتی مانند موجودی لحظه‌ای، قیمت‌های حساس یا اطلاعات مالی باید با دقت بیشتری Cache شوند.

در چنین مواردی باید بین سرعت و تازگی داده تعادل ایجاد شود.


# Cache در پروژه‌های SaaS

در یک SaaS ممکن است اطلاعات مشترک یا پرتکراری داشته باشیم:


plans

features

settings

permissions

statistics

بعضی از این داده‌ها می‌توانند گزینه‌های مناسبی برای Cache باشند.

اما در SaaSهای Multi-Tenant باید در طراحی Cache Key دقت بیشتری داشت.

مثلاً به جای:


settings

ممکن است نیاز باشد از ساختاری مانند:


tenant:15:settings

استفاده کنید.

در غیر این صورت ممکن است داده یک Tenant اشتباهاً برای Tenant دیگری برگردانده شود.

این موضوع از مهم‌ترین نکات طراحی Cache در سیستم‌های چندمستاجری است.


# بهترین روش برای انتخاب TTL

TTL را نمی‌توان برای همه داده‌ها یکسان تعیین کرد.

بهتر است براساس میزان تغییر داده تصمیم بگیرید.

نوع دادهTTL پیشنهادی
تنظیمات ثابتطولانی
دسته‌بندی‌هامتوسط تا طولانی
لیست محصولاتکوتاه تا متوسط
آمار لحظه‌ایکوتاه
API خارجیوابسته به سرویس
داده حساسبا احتیاط زیاد

این اعداد قانون ثابت نیستند.

TTL باید با رفتار واقعی Application و میزان تغییر داده تعیین شود.


# آیا Cache همیشه باعث افزایش سرعت می‌شود؟

نه لزوماً.

Cache خودش هزینه دارد.

برای مثال:


Generate Data

     ↓

Serialize

     ↓

Store

     ↓

Read

     ↓

Deserialize

اگر تولید داده بسیار ارزان باشد، ممکن است Cache کردن آن هیچ سود قابل‌توجهی نداشته باشد.

بنابراین بهترین روش این است که قبل و بعد از Cache کردن، Performance را اندازه‌گیری کنید.


# Cache در Laravel و Performance

یک فرآیند منطقی برای بهینه‌سازی می‌تواند چنین باشد:


Identify Slow Operation

          ↓

Measure

          ↓

Optimize Query / Code

          ↓

Check Indexes

          ↓

Check N+1

          ↓

Measure Again

          ↓

Cache if Useful

یعنی Cache باید بخشی از استراتژی Performance باشد، نه اولین راه‌حل برای هر مشکل سرعت.


# جمع‌بندی

Cache یکی از مهم‌ترین ابزارهای افزایش Performance در پروژه‌های Laravel است.

Laravel یک API ساده و یکپارچه برای کار با Cache در اختیار توسعه‌دهنده قرار می‌دهد و می‌توان از Storeهای مختلفی مانند File، Database و Redis استفاده کرد.

مهم‌ترین متدهایی که در این مقاله یاد گرفتیم عبارت‌اند از:


Cache::put()

Cache::get()

Cache::has()

Cache::forget()

Cache::remember()

Cache::rememberForever()

Cache::add()

Cache::increment()

Cache::decrement()

اما استفاده حرفه‌ای از Cache فقط به یادگیری این متدها محدود نمی‌شود.

مواردی مانند:

  • انتخاب Cache Store
  • طراحی Cache Key
  • TTL
  • Cache Invalidation
  • حجم داده
  • هماهنگی Cache بین Serverها
  • امنیت
  • مصرف منابع
  • جلوگیری از داده‌های قدیمی

همگی بخشی از طراحی صحیح سیستم Cache هستند.

در یک پروژه کوچک ممکن است File Cache کافی باشد، اما با رشد Application، Redis می‌تواند انتخاب قدرتمندتری برای Cache و همچنین Queue باشد.

در نهایت باید همیشه این اصل را در نظر داشته باشید:

> Cache برای کاهش هزینه عملیات‌های پرتکرار است، نه جایگزین Database.


# سوالات متداول

Cache در Laravel چیست؟

Cache در Laravel سیستمی برای ذخیره موقت داده‌ها و جلوگیری از اجرای دوباره عملیات‌های پرهزینه مانند Queryهای دیتابیس یا درخواست‌های API است.

بهترین Cache Store در Laravel چیست؟

پاسخ ثابتی وجود ندارد. برای پروژه‌های کوچک File یا Database ممکن است کافی باشد؛ در پروژه‌های بزرگ‌تر Redis معمولاً گزینه قدرتمندی است.

Cache::remember چه کاری انجام می‌دهد؟

ابتدا Cache را بررسی می‌کند. اگر داده وجود داشته باشد همان داده را برمی‌گرداند و اگر وجود نداشته باشد Callback را اجرا کرده، نتیجه را Cache می‌کند و برمی‌گرداند.

چگونه Cache در Laravel را پاک کنیم؟

برای حذف یک کلید:


Cache::forget('key');

برای پاک کردن Cache Application نیز می‌توانید از:


php artisan cache:clear

استفاده کنید.

TTL در Laravel چیست؟

TTL یا Time To Live مدت زمانی است که یک داده می‌تواند در Cache باقی بماند.

آیا Redis برای Cache در Laravel ضروری است؟

خیر. Laravel می‌تواند از Storeهای مختلف استفاده کند و Redis برای همه پروژه‌ها الزامی نیست.

آیا Cache باعث کاهش Queryهای دیتابیس می‌شود؟

اگر به‌درستی طراحی شود، بله. داده‌های پرتکرار می‌توانند از Cache خوانده شوند و در نتیجه نیاز به اجرای مجدد بعضی Queryها کاهش پیدا کند.

آیا می‌توان تمام اطلاعات پروژه را Cache کرد؟

خیر. Cache کردن همه اطلاعات معمولاً تصمیم خوبی نیست. باید داده‌هایی را انتخاب کنید که پرتکرار، هزینه‌بر و مناسب ذخیره موقت باشند.

نظرات (0)

نظرات پس از تأیید مدیر نمایش داده می‌شوند

هنوز نظری ثبت نشده است؛ اولین نفر باشید!

مقالات مرتبط

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

۲۴ دقیقه
ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

۲۲ دقیقه
ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

۲۲ دقیقه
مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

۲۲ دقیقه