Laravel’de Redis ile Cache Kullanımı

Zehra Yavuz
Mobillium
Published in
4 min readMay 27, 2022

Herkese merhabalar, 

Bu yazımda projelerimizde kullandığımız, sistemin performansını artıran Redis’e değineceğim.

Caching Nedir?

Basit bir ifadeyle web sitelerinde, uygulamalarda kullanıcılar işlerini daha hızlı ilerletmek isterler. Geliştirilen yazılımlarda kullanıcı sayısı arttıkça sistemin yavaşlaması istenmez. Bu doğrultudaki isteklerimize caching yöntemi ile çözüm buluyoruz. Caching sık kullandığımız verileri kaydetme tekniğine verilen isimdir. Kaydetme işlemi uygulamayı host eden sunucunun ram belleğinde(In Memory Caching) ve harici bir caching sunucusunda(Distributed Caching) gerçekleştirilebilir.

Redis Nedir, Nerelerde Kullanılır?

Redis (Remote Dictionary Server) için veri yapısı sunucusu diyebiliriz. Verileri bellekte tutan açık kaynaklı NoSQL veri tabanıdır.

Redis için genel bir araştırma yaptığımızda klasik bir tanım olan key-value veri yapısı deposu olduğu karşımıza çıkar. Fakat onu diğer alternatif yöntemlerden ayıran en önemli fark; Redis’in yüksek seviye veri yapılarını (list, map, set) saklaması ve kullanmasıdır.

Redis verileri öncelikli olarak kendi makinemizin RAM’inde tutar. Bu verileri isteğe bağlı olarak belirli zaman aralıklarında diske de kaydedebilir.Böylece istediğimiz zaman verilerimize diskten ulaşabiliriz, veri kaybı gibi problemlerin de önüne geçmiş oluruz. Redis’in verileri bellekte tutmasının en önemli avantajlarından bir diğeri ise okuma ve yazma işlemlerini milisaniyelere kadar düşürebilmesidir.

Laravel Redis Çalışma Mantığı

Kullanıcıdan gelen istek (request) üzerine gösterilecek veri ilk olarak cache üzerinde kontrol edilir , istenilen veriler varsa buradan çekilip gönderilir. Eğer cache boş ise ilgili veri veritabanından alınıp öncelikle cache’e kaydedilir, ardından kullanıcıya gönderilir. Bu süreçten sonraki yapılan tüm isteklere cache üzerinden veri iletimi gerçekleşecektir. Tabi ki de burada cachelenecek veri miktarı sunucunun RAM özelliklerine ve kapasitesine bağlıdır.

Redis’i Bilgisayarımıza Nasıl Kurarız?

Benim çalıştığım bilgisayar macOS olduğu için buradaki kurulum aşamasına değineceğim. Ama siz elinizdeki işlemciye göre Redis’in resmi sayfasını ziyaret ederek ilerleyebilirsiniz.

İlk olarak terminalimize komutumuzu yazıyoruz.

brew install redis

Kurulumdan sonra aşağıdaki komutu yazarak bash üzerinde redisin ayağa kalkmasını bekliyoruz.

redis-server

Yeni bir terminal penceresi açıp aşağıdaki komutu çalıştırırsanız, biraz önce ayağa kalkan Redis sunucusuna bağlanmış ve komut çalıştırabilir hale gelmiş olacaksınız.

redis-cli

Eğer açılan redis client’dan aşağıdaki gibi “ping” komutu yazıldığında, “PONG” cevabı alınıyor ise sorunsuz çalışıyor demektir.

Redis için Get ve Set komutlarının nasıl kullandığımıza bir bakalım;

  • SET : Anahtar değerine veri eklememizi sağlamaktadır. (SET key “value”)
  • GET : Anahtar üzerindeki veriye ulaşmamızı sağlamaktadır. (GET key)
  • KEYS : Kayıtlı anahtarlara ulaşmamızı sağlamaktadır. (KEYS *)

Diğer komutlar için bu sayfayı ziyaret edebilirsiniz.

Redis Cache’i Laravel Projelerimizde Nasıl Kullanırız?

Bir Laravel projesi oluşturduğumuzu varsayıyorum.

İlk olarak bilgisayarımız Redis’i kurmamız gerektiğine değindim. Şimdiki aşamada kütüphane olarak Redis için gerekli paketi projemize dahil edeceğiz.

Predis’i kurmak için terminalinizde aşağıdaki komutu çalıştırarak composer ile kurulumu yapabilirsiniz:

composer require predis/predis

Kurulum tamamlandığında Redis yapılandırma ayarlarımızı config/database.php dosyasında Redis sunucusunu içeren bir dizi göreceksiniz . Burada varsayılan client phpredis olarak gelecektir. Biz predis kullandığımız için bu şekilde güncelleyeceğiz.

'redis' => [    'client' => env('REDIS_CLIENT', 'predis'),    'default' => [        'host' => env('REDIS_HOST', '127.0.0.1'),        'password' => env('REDIS_PASSWORD', null),        'port' => env('REDIS_PORT', 6379),        'database' => env('REDIS_DB', 0),    ],    'cache' => [        'host' => env('REDIS_HOST', '127.0.0.1'),        'password' => env('REDIS_PASSWORD', null),        'port' => env('REDIS_PORT', 6379),        'database' => env('REDIS_CACHE_DB', 1),    ],],

Redis‘in temel bağlantı bilgilerini .env dosyasında güncelleyebilirsiniz.

CACHE_DRIVER=redisREDIS_HOST=127.0.0.1REDIS_PASSWORD=nullREDIS_PORT=6379

Ardından config/queue.php içinde güncelleme yapıyoruz.

'redis' => [    'driver' => 'redis',    'connection' => 'default',    'queue' => env('REDIS_QUEUE', 'default'),    'retry_after' => 90,    'block_for' => null,    'after_commit' => false,],

Sıra geldi Redis’in bize sağladığı metotlar ile verilerimizi eklemek, çıkarmak gibi işlemleri gerçekleştirmeye…

Cache varsa veriyi getir yoksa oluştur ve getir

Laravel cache kullanımını bir kod bloğu içinde örneklemek istersek; veriler daha önceden cache’lenmiş mi diye bakar. Eğer belirtilen key ile cache oluşturulmuşsa istenilen veriyi getirecektir. Belirtilen key için cache mevcut değilse SQL’imiz çalışacak ve sonuç sizin için cache’lenecektir. Burada oluşturulan cache belirtilen süre sonunda otomatik olarak temizlenir.

namespace App\Http\Controllers\Api;use Illuminate\Support\Facades\Cache;class UserController extends Controller{    public function index()    {        $value = Cache::remember('users', 600, function () {            return DB::table('users')->get();        });    }}

Bu yöntemde 3 parametremiz var:

1. users Redis'in anahtar adıdır,

2. 600 olarak verdiğim değer olan $seconds verilerin ne kadar süreyle saklandığı,

3. function(){} methodum da Redis'e kaydedilecek verileri döndüren bir işlevdir.

Cache’e veri yazma

Cache oluştururken süreli ya da süresiz olarak kayıtlarınızı oluşturulabilir. Eğer süreli cache oluşturursanız belirtilen süre sonunda cache’ler otomatik olarak temizlenecektir.

$value = Cache::put('key', 'value', $seconds);

Cache’den veri çekme

Cache’e kaydedilen verileri çekmek için get methodunu kullanıyoruz. İhtiyacınız olan durumlarda ise cache değeri için default bir değer tanımlaması da yapabilirsiniz.

$value = Cache::get('key');$value = Cache::get('key', 'default');

Kayıtlı cache verilerini getir ve cache’i temizle

Bazı durumlarda cache’ı çektikten sonra silmek isteyebilirsiniz. Bu durumda

Pull methodunu kullanabilirsiniz.

$value = Cache::pull('key');

Aslında değinebileceğimiz birçok alt konu başlığı daha var ama çok fazla uzatmadan istediğim alanları sizinle paylaştım. Umarım keyifle okumuşsunuzdur :) 

Bir sonraki yazıma kadar kendinize iyi bakın…

--

--