Utilizando Redis como sistema de cache en Symfony

¿Que es Redis?

  • Esquema de datos flexible: Se puede alterar el modelo en cualquier momento y almacenar cualquier tipo de string como objetos JSON, ademas de distintas formas de estructura de datos que soporta.
  • No hay relaciones como en una base de datos relacional, debes manejarlas por ti mismo
  • Gran rendimiento y gran escalabilidad al poder montar un cluster de servicios Redis.
  • Desde la versión 2.4 existen dos estrategias para persistir la información en disco.
  • Soporte para una gran cantidad de lenguajes de programación

Casos de Uso de ejemplo de Redis

  • Caché de páginas web: Algunos desarrolladores utilizan Redis para almacenar fragmentos de html, acelerando la entrega de estos en una aplicación web.
  • Almacenamiento de sesiones de usuario: Se emplea en numeras ocasiones para almacenar las sesiones de usuario, en un almacén de acceso muy rápido. Eso permite aligerar los tiempos de consulta al servidor. Ademas Redis permite incluir un TTL asociado a la clave, por lo que evita al desarrollador implementar la expiración de la sesión.
  • Almacenamiento de carritos de la compra: En soluciones e-commerce se puede emplear al igual que las sesiones de usuario para almacenar los artículos añadidos en un carrito de compra.
  • Caché de base de datos: Aliviando la consulta a base de datos, almacenando determinados resultados en él, sobre todo si se ejecutan con frecuencia
  • Contadores y estadísticas: Para manejar contadores y estadísticas en tiempo real, manteniendo un soporte de gestión concurrente y atómico. Por ejemplo visualizaciones de productos, votos de usuario.

Caso de uso especifico

Implementación de Redis en Symfony

Instalación del bundle SNCRedisBundle

snc_redis:
clients:
default:
type: predis
alias: default
dsn: 'redis://secret@localhost/1
cache:
type: predis
alias: cache
dsn: 'redis://secret@localhost/1'
options:
profile: 2.2
connection_timeout: 10
read_write_timeout: 3

Implementar Servicio que gestiona la cache caché

<?phpnamespace AppBundle\Services;use AppBundle\Interfaces\CacheInterface;
use JMS\Serializer\SerializationContext;
use JMS\Serializer\Serializer;
use Predis\Client;
/**
* Class ScheduleService
* @package AppBundle\Services
*/
class RedisCache implements CacheInterface
{
const TTL_MINUTE=60;
const TTL_HOUR=3660;
const TTL_DAY=86400;
/**
* @var Client
*/
private $client;
/**
* @var Serializer
*/
private $serializer;
public function __construct(Client $client, Serializer $serializer)
{
$this->client = $client;
$this->serializer= $serializer;
}
/**
* @param $key
* @return array
* @internal param $object
*/
public function get($key)
{
$this->client->get($key);
}
/**
* @param $key
* @return array
*/
public function invalidate($key)
{
$this->client->del(array($key));
}
/**
* @param $key
* @param $value
* @param int $ttl
* @return object
*/
public function set($key, $value, $ttl = 0)
{
if($ttl >0) {
$this->client->setex($key, $ttl, $value);
}else{
$this->client->set($key, $value);
}
}
/**
* @param $key
* @param $value
* @param int $ttl
* @return object
*/
public function setObject($key, $value, $ttl = 0)
{
$json=$this->serializer->serialize($value, 'json', SerializationContext::create()->enableMaxDepthChecks());
$this->set($key, $json, $ttl);
}
/**
* @param $key
* @param $value
* @param int $ttl
* @return object
*/
public function getObject($key)
{
$object=$this->client->get($key);
if(!$object){
return false;
}
return $this->serializer->deserialize($object, 'array','json');
}
}
$subscription = $this->cache->getObject($subscriptionId);if (!$subscription) {     $subscriptionDetailData = $this->getSubscriptionDetailData($subscriptionData);     $subscription = $this->subscriptionMapper->arrayToObject($subscriptionDetailData);     $this->subscriptionBuilder->addPackage($subscription, $subscriptionDetailData);     $this->subscriptionBuilder->addBonusProducts($subscription, $subscriptionDetailData);     $this->subscriptionBuilder->addThrottle($subscription, $subscriptionDetailData);    $this->cache->setObject($subscriptionId, $subscription, RedisCache::TTL_DAY);    $this->cache->setObject($subscriptionId.”detail”, $subscriptionDetailData, RedisCache::TTL_DAY);}
$this->get(‘app.cache’)->invalidate($subscriptionId);

--

--

Full Stack Web Developer — adrianalonso.es

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store