Merhaba,

 

Bu yazıda Laravel'de Redis ile Cache kullanımından bahsedeceğim. Redis'le ilgili detaylı bilgiye buradaki web sitesi üzerinden ulaşabilirsiniz.

 

Örnek uygulamamızda veritabanında makalelerin bulunduğu bir tablomuz olacak ve bu tablodaki verileri cacheleyerek getireceğiz.

 

İlk olarak boş bir Laravel projesi oluşturduğumuzu varsayıyorum.

 

Terminalde şu komutu yazarak Redis için gerekli paketi projemize dahil ediyoruz:

composer require predis/predis

 

.env dosyasını açarak Redis ile ilgili bilgileri düzenliyoruz:

CACHE_DRIVER=redis

REDIS_CLIENT=predis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

 

Şimdi veritabanında articles adında bir tablo oluşturup, bu tabloyu test verileriyle dolduralım.

 

Terminalde şu komut ile migration oluşturma işlemini yapıyoruz:

php artisan make:migration create_articles_table

 

migration up fonksiyonumuz:

public function up()
{
    Schema::create('articles', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->text('body');
        $table->timestamps();
    });
}

 

Tablo oluşturma işlemini tamamlıyoruz:

php artisan migrate

 

Terminalde şu komut ile seeder oluşturuyoruz:

php artisan make:seeder ArticleSeeder

 

ArticleSeeder kodumuz:

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use DB;
use Str;

class ArticleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        for ($i = 0; $i < 10000; $i++) {
            DB::table('articles')->insert([
                'title' => Str::random(20),
                'body' => Str::random(400)
            ]);
        }
    }
}

 

DatabaseSeeder'ın run fonksiyonuna eklemeyi yapıyoruz:

public function run()
{
    $this->call(ArticleSeeder::class);
}

 

Terminalde seeder'ı çalıştırıp örnek verilerimizi tabloya kaydediyoruz:

php artisan db:seed

 

Şimdi routes/api.php dosyamızı açarak bir route tanımlaması yapıyoruz:

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ArticleController;

Route::get('articles', [ArticleController::class, 'index']);

 

Veritabanı tablomuzu temsilen Article modelimizi oluşturuyoruz:

php artisan make:model Article

 

Son olarak controller dosyamızı oluşturup gerekli kodları yazıyoruz:

php artisan make:controller ArticleController

 

ArticleController dosyamız:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use App\Models\Article;

class ArticleController extends Controller
{
    public function index()
    {
        if (Cache::has('articles')) {
            $data = Cache::get('articles');
            return response()->json($data, 200);
        }
        $data = Article::all();
        foreach ($data as $item) {
            $item->status = true;
        }        
        Cache::put('articles', $data, 600);
        return response()->json($data, 200);
    }
}

Burada yaptığımız işlemler;

  • Cache üzerinde articles key'ine sahip bir veri var mı diye baktık ve varsa bu veriyi geriye döndürdük.
  • Öyle bir key yoksa veritabanından verileri alıp foreach döngüsüne sokarak her bir veriye status ekledik (bunu işlemin uzun sürmesi adına yaptık 😊). Bu veriyi articles key'i ile 600 saniyeliğine (10 dakika) cacheleyerek geriye döndürdük.

 

Artık yaptıklarımızı test etme zamanı. Projemizi ayağa kaldırıyoruz:

php artisan serve

 

Postman üzerinden istek yaparak verinin geliş süresini kontrol ediyoruz:

 

Redis üzerinde verinin kaydedilip edilmediğini kontrol etmek adına terminalden redis-cli'ye giriş yapıyoruz. Redis, birden fazla veritabanını içinde barındırdığından ve default olarak ilkinde işlem yaptığından dolayı biz de ilk veritabanını seçiyoruz. Sonrasında içindeki key'leri kontrol ediyoruz:

 

Şimdi de Postman üzerinden tekrar istek yaparak verinin geliş süresini kontrol ediyoruz:

 

Görüldüğü üzere yaklaşık 300 ms'lik bir fark oluştu. Elbette bu fark pek önemli görünmeyebilir ancak çok daha fazla verinin olduğu ve bu verilerin de farklı şekillerde işlenerek çok daha uzun sürebilecek işlemlerin olduğu senaryoları düşünürsek Redis ile cache kullanımının faydalarını daha iyi anlayabiliriz. 

 

Örnek projemizin Github linkine buradan ulaşabilirsiniz.

 

Umarım faydalı olmuştur.

 

İyi çalışmalar.