2016-02-13 2 views
0

Итак, я добавляю Redis в уже разработанный проект, и мне интересно, куда именно положить эти кеш-вызовы. Есть существующие модели, и мне интересно, если я могу просто вводить Redis в модели, а затем завернуть каждый запрос с кодом кэша, например:Где вызовы кеша идут в MVC

$cacheKey = "table/{$id}"; 
// If table entity is not in cache 
if (!$predis->exists($cacheKey)) { 

    // Pre-existing database code 
    $this->db->query('SELECT * FROM table WHERE table.id = "'.$id.'" '); 
    $query = $this->db->get(); 
    $result = $query->result_array(); 

    // Set entity in redis cache 
    $predis->set($cacheKey, json_encode($result[0])); 

    return $result[0]; 
} 

// Return cached entity from redis 
return json_decode($predis->get($cacheKey), true); 

Но я просто интересно, если это грязный хак , или на самом деле лучший способ делать вещи, и является ли это наиболее подходящим местом для размещения кода кеша? Я узнал из предыдущих проектов, что лучше делать все правильно, в первый раз!

ответ

0

Сначала вы должны сначала профилировать свое приложение и найти, какие части чаще всего называются и которые являются самыми медленными.

Вы получите лучший результат, если вы будете кэшировать целые части HTML, а не отдельные строки базы данных. (http://kiss-web.blogspot.com/2016/02/memcached-vs-redisphpredis-vs-predis-vs.html).

Лично я считаю, что Cache :: Remeber лучше картина:

class Cache { 
    protected $connection; 
    public function __construct($options) { 
     $this->connection = new Client($options); 
    } 

    public function remember($key, $closure, $expiration = 86400) { 

     $result = $this->connection->get($key); 

     if($result!==false) { 
      return unserialize($result); 
     } 
     $result = $closure(); 

     $this->connection->set($key, serialize($result), 'ex', $expiration); 

     return $result; 
    } 
} 

Теперь ваш код будет выглядеть следующим образом:

$cacheKey = "table/{$id}"; 
return $cache->remember($cacheKey, function() use ($id) { 
    $this->db->query('SELECT * FROM table WHERE table.id = "'.$id.'" '); 
    $query = $this->db->get(); 
    $result = $query->result_array(); 
    return $result[0]; 
}); 
Смежные вопросы