ذخیره درون حافظه ای کش در Laravel با Memoization

ذخیره درون حافظه ای کش در Laravel

در توسعه برنامه‌های لاراول، استفاده بهینه از کش اهمیت زیادی در افزایش سرعت و کاهش بار روی منابع سرور دارد. اما زمانی که در طول یک درخواست HTTP چندین بار به داده‌های کش‌شده نیاز پیدا می‌کنیم، ممکن است هر بار درخواست مجددی به کش سرور ارسال شود که این خود باعث کندی عملکرد می‌شود. لاراول برای حل این مشکل قابلیتی به نام rememberOnStore ارائه کرده است که داده‌های کش را به طور درون حافظه ای (memoization) ذخیره می‌کند تا در طول یک درخواست، بارها بدون اتصال مجدد به کش سرور از آن استفاده شود. در این مقاله آموزشی یاد می گیریم که چگونه از روش Memoization در لاراول استفاده کنیم.

تکنیک Memoization

در فریمورک لاراول (Laravel)، کش کردن داده‌ها از طریق درایورهای مختلفی مثل Redis، Memcached، DynamoDB و حتی فایل انجام می‌شود. این قابلیت باعث شده تا توسعه‌دهندگان بتوانند داده‌های خود را به راحتی و با سرعت بیشتر مدیریت کنند. اما مشکلی که وجود دارد این است که با هر بار درخواست برای دسترسی به داده‌های کش‌شده، اتصال جدیدی به کش سرور برقرار می‌شود. این موضوع در پروژه‌های بزرگ که درخواست‌های زیادی به کش ارسال می‌شود می‌تواند منجر به کندی و افزایش بار سرور شود.

برای رفع این مشکل، مفهومی به نام ذخیره درون حافظه ای کش (Memoization) معرفی شده است. این تکنیک باعث می‌شود پس از اولین دسترسی به داده‌های کش شده، داده‌ها در حافظه محلی ذخیره شوند و دفعات بعدی به جای ارسال درخواست جدید به کش سرور، مستقیماً از حافظه‌ی داخلی خوانده شوند. لاراول با افزودن متد rememberOnStore این امکان را به توسعه‌دهندگان داده است که به راحتی از این بهینه سازی مهم بهره ببرند.

ذخیره درون حافظه ای کش لاراول

لاراول یک رابط کش بسیار کارآمد ارائه می‌دهد که از درایورهای مختلفی مانند Redis، Memcached، DynamoDB و حتی فایل برای ذخیره داده‌ها پشتیبانی می‌کند. این ویژگی عملیات کش کردن داده‌ها را بسیار آسان و بی‌دردسر کرده است. اما مشکلی وجود دارد، اینکه وقتی شما داده‌ای را کش می‌کنید و سپس در طول چرخه‌ی عمر یک درخواست HTTP چندین بار به همان داده نیاز پیدا می‌کنید، در واقع هر بار یک درخواست جدید به کش سرور (مثلاً Redis یا Memcached) ارسال می‌شود. این مسئله می‌تواند باعث کاهش کارایی برنامه شود، به خصوص زمانی که داده‌ی موردنظر تغییری نکرده باشد.

راه‌حل: ذخیره درون حافظه ای کش

برای حل این مشکل می‌توانیم از مفهومی به نام memoization استفاده کنیم. در این تکنیک پس از اولین بار واکشی داده از کش سرور، داده را در حافظه موقت (درون حافظه سیستم) ذخیره می‌کنیم. بدین ترتیب در درخواست‌های بعدی در همان چرخه‌ی عمر نیازی به ارتباط مجدد با کش سرور نیست و داده مستقیماً از حافظه‌ی داخلی بازیابی می‌شود. خوشبختانه لاراول از نسخه‌ی ۹ به بعد، متدی به نام rememberOnStore در کلاس Cache ارائه کرده است که این کار را به سادگی انجام می‌دهد.

چطور کار می‌کند؟

فرض کنید به شکل معمولی داده‌ای را کش می‌کنید:

$value = Cache::remember('foo', 3600, function () { return 'bar'; });

123 $value = Cache::remember('foo', 3600, function () {return 'bar';});

در این کد اگر کلید foo در کش موجود نباشد، مقدار ‘bar’ تولید شده و برای ۳۶۰۰ ثانیه (یک ساعت) در کش ذخیره می‌شود. اما اگر بخواهید همین مقدار را در طول چرخه‌ی عمر درخواست چندین بار بخوانید بدون اینکه هر بار به کش سرور درخواست دهید، یکی از راه‌های اولیه این است که از درایور array استفاده کنید:

Cache::store('array')->remember('foo', 3600, function () { return 'bar'; });

123 Cache::store('array')->remember('foo', 3600, function () {return 'bar';});

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

راه بهتر: استفاده از rememberOnStore

برای بهینه سازی بهتر، لاراول روش rememberOnStore را معرفی کرده است:

$value = Cache::rememberOnStore('redis', 'foo', 3600, function () { return 'bar'; });

123 $value = Cache::rememberOnStore('redis', 'foo', 3600, function () {return 'bar';});

در این روش:

  • لاراول ابتدا بررسی می‌کند که آیا کلید ‘foo’ در حافظه‌ی داخلی (in-memory) موجود است یا خیر.
  • اگر موجود نباشد، به کش سرور (در اینجا Redis) مراجعه کرده و مقدار را دریافت می‌کند.
  • سپس مقدار دریافت شده را هم در کش سرور و هم در حافظه‌ی داخلی برای استفاده‌های بعدی ذخیره می‌کند.
  • دفعات بعدی در همان درخواست، داده مستقیماً از حافظه‌ی داخلی خوانده می‌شود، بدون ارسال درخواست مجدد به کش سرور.
در پشت صحنه چه اتفاقی می‌افتد؟

در این فرایند، لاراول داده‌های بازیابی شده را در یک متغیر آرایه‌ای در حافظه Laravel ذخیره می‌کند. بنابراین هنگام درخواست‌های بعدی برای همان کلید، داده مستقیماً از این آرایه خوانده می‌شود و نیازی به ارتباط جدید با کش سرور نیست.

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

نتیجه‌گیری

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

منبع: laravel-news

بدون دیدگاه

دیدگاهتان را بنویسید