کش کردن کوئری‌های الوکوئنت در لاراول

وقتی صحبت از سرعت سایت و اپلیکیشن می‌شود، کش می‌تواند بهترین گزینه باشد. کش کردن تاثیر زیادی در سرعت سایت دارد. خوشبختانه لاراول به صورت از پیش نصب شده درایورهای کش دارد که بدون هیچ زحمتی می‌توانید از آنها استفاده کرده و سرعت سایت را بهبود ببخشید. Redis و Memcached یا تنها استفاده از فایل‌های لوکال، لاراول همه اینها را دارد.

در این مقاله پیاده سازی کش برای کوئری‌های الوکوئنت به صورت مستقیم از لاراول را بررسی می‌کنیم، که کش در دیتابیس را ساده می‌سازد.

نصب و راه اندازی 

پکیج را می‌توانید از طریق کامپوزر نصب کنید:

composer require rennokki/laravel-eloquent-query-cache

مدل‌های شما به تریت QueryCacheable نیاز دارند:

use Rennokki\QueryCache\Traits\QueryCacheable;
class Article extends Model
{
    use QueryCacheable;
    ...
}

کش را به صورت پیش فرض فعال کنید

پکیج به صورت پیش فرض کش را فعال نمی‌کند. پراپرتی cacheFor$ را به مدل اضافه کنید:

use Rennokki\QueryCache\Traits\QueryCacheable;
class Article extends Model
{
    use QueryCacheable;
    protected $cacheFor = 180; // 3 minutes
}

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

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

// database hit; the query result was stored in the cache
Article::latest()->get();
// database was not hit; the query result was retrieved from the cache
Article::latest()->get();

چنانچه می‌خواهید از استفاده از کش جلوگیری کنید، از متد ()dontCache-> قبل از تریگر کردن متد آخر استفاده کنید.

Article::latest()->dontCache()->firstOrFail();

فعال کردن کش به صورت کوئری به کوئری

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

اول از همه، متغیر cacheFor$ را از مدل حذف کنید. در هر کوئری با فراخونی (...)cacheFor->  مشخص می‌کنید که قصد کش کردن آن کوئری را دارید.

Article::cacheFor(now()->addHours(24))->paginate(15);

با تگ‌ها بهتر سازماندهی کنید

بعضی از ذخیره سازهای کش مثل Redis یا Memcached از تگ زدن کلیدها پشتیبانی می‌کنند. این ویژگی از این منظر خیلی مفید است که کوئری کش شده را تگ می‌زنیم و هر وقت که بخواهیم کش مورد نظرمان را غیرفعال می‌کنیم. 

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

$articles = Article::cacheFor(60)->cacheTags(['latest:articles'])->latest()->get();
$article = Article::find($id);
$article->update(['title' => 'My new title']);
Article::flushQueryCache(['latest:articles']);

متد flushQueryCache فقط کش تگ شده با latest:articles را پاک می0157کند. اگر کوئری‌های دیگر با تگی به جز latest:articles تگ شده باشند در کش نگه داشته می‌شوند.

 

 

 

 

 

 

 

 

رقیه اباذری

رقیه اباذری

تو دانشگاه IT خوندم و اکثر منابع کتاب‌های ترجمه شده بودند و صدالبته مبهم :( مثلا element رو "عنصر" ترجمه می‌کردن و من همیشه می‌رفتم تو شیمی و جدول مندلیف. تو باورژن سعی کردم تا حد ممکن مطالب رو با زبان ساده و قابل درک بنویسم. باشد که کسانی که تازه پا به عرصه برنامه‌نویسی گذاشتن، راغب‌تر بشن و با نظرات و فیدبک‌های شما راه هموارتر بشه:)

دیدگاه‌ها


ثبت دیدگاه