Cache en Laravel (REDIS)

Vamos a instalar y usar la cache de Laravel, en este caso Redis

Para instalar Redis en nuestra aplicación debemos instalarla en nuestro sistema, instalar el módulo de php y lo necesario con composer para laravel:

sudo apt install redis
sudo apt install php-redis
composer require predis/predis

sudo systemctl restart apache2

Una vez instalado debemos modificar el fichero de configuración para que use redis de cache, teniendo en cuenta que nuestro driver de cache lo cambiaríamos por «redis», y añadiríamos nuestro cliente de redis a «predis». Así, las líneas más importantes relativas a la cache y redis en nuestro fichero .env serían:

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

Una vez lo tenemos instalado todo correctamente, para usarlo debemos hacer dos cosas: cachear y actualizar la cache.

CACHEAR

Para lo primero en nuestro controlador podemos cachear de maneras diferentes, que deberemos estudiar. Yo voy a usar en este ejemplo «tags» y a encapsularlo todo en una función

        $json = Cache::tags('calculos')->rememberForever('calculo1', function () use ($request) {
             $q = Modelo->where(...)->orderby(...);
             return $q->get()->toJson();
         });
         return $json;

Como vemos en el código cacheamos el JSON del resultado del SQL para siempre, así que no ejecutaremos otra vez la SQL hasta que no se borre la cache. Y con los tags estamos agrupando todas las cache para trabajar con ellas en grupo. Por ejemplo no tendremos que ir borrando cada cache con su nombre, las borraremos en grupo.

ACTUALIZAR CACHE

Para actualizar la cache usaremos «Observers», así tendremos actualizada siempre nuestra cache. Para crear un observer haremos:

php artisan make:observer CalculosObserver --model=Modelo

Y lo editamos para que use nuestro modelo y se borre al crear, borrar o actualizar nuestro modelo

namespace App\Observers;
use App\Models\Modelo;
class CalculosObserver
{
    public function created(Modelo $modelo)
    {
        //
        Cache::tags('calculos')->flush();
    }

    public function updated(Modelo $modelo)
    {
        //
        Cache::tags('calculos')->flush();
    }

    public function deleted(Modelo $modelo)
    {
        //
        Cache::tags('calculos')->flush();
    }
...

Y haremos que se ejecute editando app/Providers/AppServiceProvider.php

use App\Models\Modelo;
use App\Observers\CalculosObserver;

    public function boot()
    {
        //
        Modelo::observe(CalculosObserver::class);
    }

De esta manera tenemos un ejemplo de como cachear una SQL pesada/costosa y actualizada cada vez que añadamos un nuevo registro, lo modifiquemos o lo borremos.