سلام دوستان من پستم رو به این صورت کش کردم
حالا اگر بخوام توی همین فانکشن مثلا دسته بندی رو کش کنم باید از یک if برای اونم بنویسم یا میشه بصورت ارایه تعریف کرد کش رو
ممنون
public function single($category, $slug)
{
if (Cache::has('post')) {
$post = Cache::get('post');
} else {
$post = Post::whereslug($slug)->first() ?? abort('404');
Cache::put('post', $post, Carbon::now()->addDay(10));
}
}
به نظرم بهتر و مفهوم تره اگر در چنین شرایطی بجای if و else نوشتن از متد remember استفاده کنید:
you may wish to retrieve all users from the cache or, if they don't exist, retrieve them from the database and add them to the cache. You may do this using the Cache::remember method:
$value = Cache::remember('users', $seconds, function () {
return DB::table('users')->get();
});
و نکته بعد اینکه در استفاده از کش زیاده روی نکنید. منطقا مواردی باید کش شوند که بازیابی مجددشون عملیات سنگینی محسوب میشه یا نتیجه یک کوئری سنگین هست یا...
با این توصیف به نظرم چندان منطقی نیست نتیجه کوئری به این سادگی رو کش کنید.
و نکته بعد هم اینکه در نظر داشته باشید کش یک فضای key-value هست. یعنی شما برای هر مقدار یک key خواهید داشت. پس استفاده از عناوینی مثل post
برای عنوان کش قطعا مشکل زا خواهد بود. چرا که در صورت اجرا به همین صورت وارد صفحه هر یک از مقالات که بشید با یک نتیجه یکسان مواجه خواهید شد!
کلا شاید بد نباشه یکبار دیگه مستندات Cache لاراول رو بصورت دقیق مطالعه کنید:
https://laravel.com/docs/8.x/cache
وقتی شما یک کوئری ساده مثل
Post::whereslug($slug)->first()
دارید نه چه نیاز به کش هست؟ اصلا خود فرایند کش کردن یک سرباری داره و صرفا در مواقعی باعث افزایش سرعت و بهره وری میشه که در مجموع بیارزه. مثلا جلوی اجرا شدن تعداد زیادی کوئری سنگین رو بگیره یا حجم پرازش زیادی رو خلاصه کنه یا ...
در این مثال شما، گرچه شاید به چشم نیاد ولی به نظرم بیشتر ضدبهره وری هست!
ضمن اینکه اصلا نحوه اجرا و پیاده سازیتون هم اشتباه هست و به مشکلی که قبلا عرض کردم بر میخورید.
@mhyeganeh ممنون از شما
این کوئری مثال بود برای راحت نوشتن این مثال رو نوشتم
اما وقتی مثلا یک سایت 500 تا مقاله داره بهتر نیست کش کنیم؟
وقتی سایتی ۵۰۰ تا مقاله داره (اصلا بگیم ۵۰۰۰۰ مقاله) شما عملا هیچ وقت نباید ۵۰۰ تاش رو یکجا از دیتابیس فراخونی کنید!
بلکه اگر قصد نمایش لیست مقالات رو دارید باید از pagination استفاده کنید و هر سری مثلا ۱۵ تاش رو بگیرید.
اگر هم قصد نمایش یک مقاله تک رو دارید که میشه همین مثالی که زدید و سر و کارتون فقط با یک مقاله هست.
دیتابیس ها این دو قضیه که اشاره کردم براشون آب خوردنه و در کسری از ثانیه پاسخ خواهند داد.
@mhyeganeh خیلی ممون ببخشید زیاد سوال پرسیدم میشه یک نمونه از جاهایی که کش رو باید استفاده کرد رو بگید؟
نصف مسیر یادگیری «سوال خوب» پرسیدنه 😉 پس عذرخواهی نداره
یک مثال ملموسش شاید محاسبه تجربه کاربری های کاربران راکت و رتبه بندیشون باشه. اگر از کش استفاده نکنید احتمالا مجبور خواهید شد به ازای هر درخواست (!) به یکی از صفحات مربوطه، برید کل سوابق یک کاربر رو بیرون بکشید و مطابق با فرمولی که دارید حساب و کتاب ها رو انجام بدید و در نهایت نمایش بدید. و احتمال داره اینجوری مجبور به اجرای چند صد کوئری و سر وکار داشتن با چند صد مدل و حجم زیاد مصرف RAM و زمان اجرای طولانی و ... بشید.
در حالیکه میتونید مثلا هر ۲۴ ساعت ، یکباراین عملیات رو انجام بدید و خروجی نهایی رو کش کنید و از این به بعد تا ۲۴ ساعت آینده از همین خروجی کش شده استفاده کنید و دیگه نیازی به اجرای چند صد کوئری و ... نخواهید داشت. بلکه مستقیما خروجی نهایی رو از کش میخونید.
پیشنهاد میکنم اول یکبار مستندات لاراول رو کامل مطالعه کنید. بعد تو یوتیوب کانال laravel-daily رو پیدا کنید وکلید واژه cache رو داخل این کانال سرچ کنید. ویدیوها و مثال های عملی خیلی عالی ای داره که به فهم بهتر کمک میکنه.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟