Symfony’de Redis Servisinin Kullanımı

By | 19 July 2017

Bu yazıda makinemize Symfony içinde Redis servisine kayıt kaydedip, ardından kaydettiklerimizi çekip, silmek istediklerimizi de sileceğiz. Bu örneği ikiye ayırabiliriz; Symfony Controller tarafından isteğimizi belirtip, Symfony Servisleri içinde istediğimiz işlemi gerçekleştireceğiz. Makinede Redis servisinin kurulu olduğunu varsayarak, Redis servisini Php ile konuşturmamıza yarayan paketi de buradan kurabilirsiniz. Kurulumu tamamladıktan sonra aşağıdaki satırı php.ini dosyasına eklemeyi unutmayın.

extension = redis.so

Ardından Redis servisine Symfony’nin bağlanabilmesi için config.yml içine aşağıdaki
satırları giriyoruz. Burada yüzde içinde olan değerler parameters.yml içinden geliyor
Kendi makinenizdeki redis konfigürasyonuna göre parameters.yml içini doldurmayı unutmayın.

doctrine_cache:
    aliases:
        cache: "%cache_provider%"
    providers:
        redis_cache:
            namespace: "%redis_cache_keyspace%"
            redis:
                host: "%redis_cache_host%"
                port: "%redis_cache_port%"
       array_cache:
            type: array

Örnek olması açısından benim makinemdeki değişkenler;

cache_provider: array_cache
redis_cache_host: localhost
redis_cache_port: 6379
redis_cache_keyspace: mertblog

Ekledikten sonra kodlara geçebiliriz. Öncelikle Service dizinimizin altında Redis servisimizi yazıyoruz, aşağıdaki yorum satırları ile birlikte kodları anlattım;

<?php

namespace AppBundle\Service;

use Doctrine\Common\Cache\Cache;

class RedisService
{
    private $cache;
    /**
    * RedisService constructor.
    * @param Cache $cache
    */
    public function __construct(Cache $cache)
    {
        $this->cache = $cache;
    }

    //lifetime => verinin ne kadar süre tutulacağı giriliyor. Saniye cinsinden değer alıyor.
    //key ve value girilerek veri kaydediliyor.
    public function insert($key, $value, $lifetime = null)
    {
        return $this->cache->save($key, $value, $lifetime);
    }

    //key gönderilerek istenilen veri alınıyor.
    public function get($key)
    {
        return $this->cache->fetch($key);
    }

    //key gönderilerek istenilen veri siliniyor
    public function delete($key)
    {
        return $this->cache->delete($key);
    }

}

Servis sınıfımızı yazdıktan sonra services.yml dosyasına aşağıdaki satırları ekliyoruz

redis_service:
    class: AppBundle\Service\RedisService
    arguments: ["@doctrine_cache.providers.redis_cache"]

Artık servisimiz hazır ve Controller tarafından erişilebilir durumda. Controller dosyamızı da aşağıdaki gibi hazırlıyoruz.


<?php

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

/**
* @package AppBundle\Controller
* @Route("/")
*/
class RedisApiController extends Controller
{

    /**
    * @return object
    */
    public function getRedisService()
    {
        //redis service return eden fonksiyon.
        return $this->get('redis.service');
    }

    /**
    * @Route("/insert", name="insert")
    */
    public function insertAction(){
        //1 saatliğine key'i website olan, değeri 'http://mertblog.net' olan veriyi redis'e set ediyor.
        $this->getRedisService()->insert('website', 'http://mertblog.net', 3600);
    }

    /**
    * @Route("/get", name="get")
    */
    public function getAction(){
        //webSite değişkenine redis'ten gelen değeri set ediyor..
        $webSite = $this->getRedisService()->get('website');
    }

    /**
    * @Route("/delete", name="delete")
    */
    public function deleteAction(){
        //website adında key'e sahip olan değeri siliyor.
        $this->getRedisService()->delete('website');
    }
}

Buradaki Controller’da istek yapılan Route’a göre işlemler gerçekleştiriliyor. Kodları yorum satırları ile anlatmaya çalıştım. Bu yazıda anlatacaklarım şimdilik bu kadar, görüşmek üzere… 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

*