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.