مهدی
2 سال پیش توسط مهدی مطرح شد
7 پاسخ

کش در لاراول

سلام دوستان من پستم رو به این صورت کش کردم
حالا اگر بخوام توی همین فانکشن مثلا دسته بندی رو کش کنم باید از یک 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));
        }
    }

ثبت پرسش جدید
محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 2 سال پیش آپدیت شد
1

به نظرم بهتر و مفهوم تره اگر در چنین شرایطی بجای 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


مهدی
تخصص : Backend Developer
@mahdidv 2 سال پیش مطرح شد
0

@mhyeganeh یعنی نیاز نیست مقالات رو کش کنیم؟


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 2 سال پیش آپدیت شد
1

وقتی شما یک کوئری ساده مثل

Post::whereslug($slug)->first()

دارید نه چه نیاز به کش هست؟ اصلا خود فرایند کش کردن یک سرباری داره و صرفا در مواقعی باعث افزایش سرعت و بهره وری میشه که در مجموع بیارزه. مثلا جلوی اجرا شدن تعداد زیادی کوئری سنگین رو بگیره یا حجم پرازش زیادی رو خلاصه کنه یا ...

در این مثال شما، گرچه شاید به چشم نیاد ولی به نظرم بیشتر ضدبهره وری هست!

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


مهدی
تخصص : Backend Developer
@mahdidv 2 سال پیش مطرح شد
0

@mhyeganeh ممنون از شما
این کوئری مثال بود برای راحت نوشتن این مثال رو نوشتم
اما وقتی مثلا یک سایت 500 تا مقاله داره بهتر نیست کش کنیم؟


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 2 سال پیش مطرح شد
1

وقتی سایتی ۵۰۰ تا مقاله داره (اصلا بگیم ۵۰۰۰۰ مقاله) شما عملا هیچ وقت نباید ۵۰۰ تاش رو یکجا از دیتابیس فراخونی کنید!

بلکه اگر قصد نمایش لیست مقالات رو دارید باید از pagination استفاده کنید و هر سری مثلا ۱۵ تاش رو بگیرید.
اگر هم قصد نمایش یک مقاله تک رو دارید که میشه همین مثالی که زدید و سر و کارتون فقط با یک مقاله هست.

دیتابیس ها این دو قضیه که اشاره کردم براشون آب خوردنه و در کسری از ثانیه پاسخ خواهند داد.


مهدی
تخصص : Backend Developer
@mahdidv 2 سال پیش مطرح شد
0

@mhyeganeh خیلی ممون ببخشید زیاد سوال پرسیدم میشه یک نمونه از جاهایی که کش رو باید استفاده کرد رو بگید؟


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 2 سال پیش آپدیت شد
3

نصف مسیر یادگیری «سوال خوب» پرسیدنه 😉 پس عذرخواهی نداره


یک مثال ملموسش شاید محاسبه تجربه کاربری های کاربران راکت و رتبه بندیشون باشه. اگر از کش استفاده نکنید احتمالا مجبور خواهید شد به ازای هر درخواست (!) به یکی از صفحات مربوطه، برید کل سوابق یک کاربر رو بیرون بکشید و مطابق با فرمولی که دارید حساب و کتاب ها رو انجام بدید و در نهایت نمایش بدید. و احتمال داره اینجوری مجبور به اجرای چند صد کوئری و سر وکار داشتن با چند صد مدل و حجم زیاد مصرف RAM و زمان اجرای طولانی و ... بشید.

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

پیشنهاد می‌کنم اول یکبار مستندات لاراول رو کامل مطالعه کنید. بعد تو یوتیوب کانال laravel-daily رو پیدا کنید وکلید واژه cache رو داخل این کانال سرچ کنید. ویدیوها و مثال های عملی خیلی عالی ای داره که به فهم بهتر کمک می‌کنه.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام