استفاده از cache از طریق redis در لاراول

حمید تیموری 525 بازدید 1398/12/19
استفاده از cache از طریق redis در لاراول

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

config/cache.php

همانطور که در فایل ذکر شده مشاهده میکنید، لاراول از driver هایی همچون apc ، array ، database ، file ، memcached ، redis و dynamodb پشتیبانی میکند.
در این مقاله ما از Redis برای cache استفاده میکنیم.
مطمئن شوید که Redis روی سیستم شما نصب باشد.


قدم اول : ساخت مدل ، کنترلر و فکتوری
دستور زیر را برای ساخت مدل و فکتوری و کنترلر اجرا میکنیم:

php artisan make:model Post -fmr

با اجرای دستور بالا ۴ فایل مدل، کنترلر، فکتوری و migration برای Post ساخته میشود.


قدم دوم : آماده کردن جدول و مدل
به فایل migration چند فیلد اضافه میکنیم

 public function up()
 {
    Schema::create('posts', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedInteger('user_id');
        $table->unsignedInteger('category_id');
        $table->string('title');
        $table->longText('body');
        $table->string('thumbnail_path')->nullable();
        $table->timestamps();

        $table->foreign('user_id')
              ->references('id')->on('users')->onDelete('cascade');
        $table->foreign('category_id')
              ->references('id')->on('categories')->onDelete('cascade');
   });
}


قدم سوم : آماده کردن فکتوری برای ساخت اطلاعات fake 
حالا برای اینکه اطلاعات fake و ساختگی داشته باشیم factory را تغییر آماده میکنیم:

use App\Post;
use Faker\Generator as Faker;

$factory->define(Post::class, function (Faker $faker) {
    return [
       'user_id' => function(){
        	      return \App\User::all()->random();
                    },
       'category_id' => function(){
         	      return \App\Category::all()->random();
                    },
       'title' => $faker->sentence(5),
       'body' => $faker->text
    ];
});


قدم چهارم : راه اندازی دیتابیس
بعد از اینکه در Mysql یا هر دیتابیس دیگری که یک دیتابیس ساختید و در لاراول آن را ثبت کردید، دستوری migrate را بزنید که جدوال ساخته شوند.

قدم پنجم : ساخت داده های fake
حالا برای اینکه اطلاعات fake در جداول ساخته شوند ترمینال را باز کنید و دستورات زیر را اجرا کنید

1. php artisan tinker
2. factory(\App\Post::class,1000)->create()
3. exit


قدم ششم : تغیر تنظیمات cache
به مسیر config\cache.php بروید و driver را به redis تغییر دهید

'default' => env('CACHE_DRIVER', 'redis'),

و همچنین در فایل env هم driver را تغییر دهید

CACHE_DRIVER=redis

 

قدم هفتم : نصب predis
دستور زیر را برای نصب predis اجرا کنید

composer require predis/predis


حالا برای ادامه کار باید یک event و یک listener بسازیم. ساخت این دو فایل به این دلیل است که اطلاعات را از cache بخوانیم، اگر دیتا در cache نبود آنگاه از دیتابیس اطاعات را میخوانیم.
و اگر دیتای جدیدی ساخته شود، event اجرا میشود و اطلاعات cache به روز میشود

قدم هشتم : ساخت event and listener
دستورات زیر را اجرا کنید تا event و listener ساخته شود.

php artisan make:event PostCreated
php artisan make:listener PostCacheListener

حالا فایل listener را باز کنید:

namespace App\Listeners;

use App\Post;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use cache;

class PostCacheListener
{
    
    public function __construct()
    {
        //
    }

    public function handle($event)
    {
        
        cache()->forget('posts'); //forget all the cache data initially 

        $post = Post::all(); //fetch all data

        cache()->forever('posts', $post); // and put them into cache forever
    
    }
}

در این کد ابتدا همه cache ها را پاک میکنیم، و سپس همه اطلاعات جدول را گرفته و در cache قرار میدهیم. مدت زمان cache بستگی به شما دارد، از چند ثانیه تا چندین ساعت و یا به صورت همیشگی میتوانید cache را انجام دهید.

حالا مدل Post را باز میکنیم و event خود را در مدل تعریف میکنیم:

namespace App;

use App\Events\PostCreated;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
  protected $guarded = [];

  protected $dates = [
    'created_at'
  ];

  protected $dispatchesEvents = [
    'created' => PostCreated::class //When a post is created then this Event will be fired
  ];


قدم نهم : ثبت event و listener
حالا وقت آن است که event و listener خود را در لاراول معرفی کنیم
وارد مسیر زیر شوید:

app\Providers\EventServiceProvider.php

فایل های خود را تعریف میکنیم:

namespace App\Providers;

use App\Events\PostCreated;
use App\Listeners\PostCacheListener;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;

class EventServiceProvider extends ServiceProvider
{
    
    protected $listen = [

        PostCreated::class => [
            PostCacheListener::class,
        ],

    ];

    public function boot()
    {
        parent::boot();

        //
    }
}


قدم دهم : آماده سازی کنترلر
حالا کنترلری که قبلا ساختیم را باز کنید و کد زیر را در آن paste کنید:

namespace App\Http\Controllers\Frontend;

use cache;
use App\Http\Controllers\Controller;
use App\Post;
use Illuminate\Http\Request;

class FrontendController extends Controller
{
    public function Index()
    {
        $data['posts'] = cache('posts', function () {
            return Post::with('user', 'category')->orderBy('created_at', 'desc')->take(5)->get();
        });

        return view('welcome', $data);
    }
}

کد بالا به این شکل است که ابتدا از اطلاعات از cache خوانده میشود، اگر cache وجود نداشت callback function اجرا میشود و اطلاعات از دیتابیس گرفته میشود و در cache قرار داده میشود
و تا زمانی که رکورد جدیدی ثبت نشود اطلاعات از cache خوانده میشود و به محض ثبت رکورد جدید event ما توسط مدل صدا زده میشود.


دقت کنید که این یک روش برای استفاده از cache بود، و شما میتوانید از روش های متعددی برای این موضوع استفاده کنید.
اگر سوالی داشتید میتونید از قسمت نظرات بپرسید

دیگر مقالات
حمید تیموری 526 بازدید 1398/10/19
حمید تیموری 1864 بازدید 1397/05/09
امید کیانی 359 بازدید 1398/06/17
حمید تیموری 2008 بازدید 1397/08/15
حمید تیموری 1050 بازدید 1397/08/01


نظرات (0)
هنوز نظری ثبت نشده است
برای ثبت نظر ابتدا وارد سایت شوید