Rendimiento y monitorización

Redis persistente para colas, sesiones y Horizon

Revisado el 12 min de lectura redis colas sesiones laravel

Redis Cache es una caché: empieza vacío cada vez que se reinicia y descarta claves cuando se llena. Sirve para guardar lo que la aplicación puede volver a calcular, no una cola de trabajos pendientes ni la sesión de un usuario. Para eso está el Redis persistente: una instancia propia de tu cuenta que guarda sus datos en disco y no los descarta al llenarse.

Es Valkey 8, compatible con Redis: funcionan los mismos comandos y los mismos clientes, como PhpRedis. Está disponible en los planes Avanza, Max y Elástico.

Redis Cache o Redis persistente

Redis Cache Redis persistente
En todos los planes En Avanza, Max y Elástico
Para caché Para colas, sesiones y Horizon
De 16 a 200 MB, según el plan De 64 a 512 MB, a tu elección
Al reiniciarse, empieza vacío Al reiniciarse, conserva sus datos
Al llenarse, descarta claves Al llenarse, rechaza escrituras
Fuera de las copias En las copias diarias

Redis Cache se conecta por /tmp/redis.sock; el Redis persistente, por /home/USUARIO/.hostsuar/redis/redis.sock, con tu usuario de cPanel en lugar de USUARIO. La memoria de Redis Cache depende del plan; la del persistente la eliges tú, hasta 128 MB en Avanza, 256 MB en Max y 512 MB en Elástico.

Puedes usar los dos a la vez: la caché en Redis Cache y las colas y sesiones en el Redis persistente. Lo explicamos más abajo.

En los dos casos el puerto es 0: se conectan por socket, sin acceso por red. La aplicación tiene que ejecutarse en el propio hosting.

Activarlo

  1. En el área de clientes, abre Hosting, entra en tu servicio y ve a Gestor de paquetes.
  2. En la tarjeta Redis persistente, pulsa Activar.
  3. Revisa la memoria, la persistencia y qué hacer al llenarse. Los valores por defecto sirven para colas, sesiones y Horizon.
  4. Confirma y espera a que el panel lo muestre en marcha.

El Redis persistente ocupa uno de los procesos persistentes del plan y aparece también en Herramientas > Procesos. Cada cuenta tiene uno; si ya están ocupados todos los procesos de tu plan, borra uno antes de activarlo.

Corre con el usuario de tu cuenta y dentro de sus recursos. Solo ese usuario puede abrir el socket, así que no necesita contraseña.

Ajustes

Memoria. 64 MB por defecto, con un máximo de 128 MB en Avanza, 256 MB en Max y 512 MB en Elástico. Colas y sesiones ocupan poco: 64 MB alcanzan para la mayoría de aplicaciones. Con Horizon, la memoria crece con las métricas y los trabajos recientes que guarda; se ajustan en trim, dentro de config/horizon.php.

Persistencia.

  • Cada segundo (por defecto): escribe cada cambio en un fichero de registro (AOF) y lo pasa a disco cada segundo. Ante un corte se pierde, como mucho, el último segundo. Es la que necesitan colas y sesiones.
  • Sin persistencia: todo vive en memoria y un reinicio lo deja vacío. Úsala solo si guardas datos que puedes regenerar.

Lo que guarda en disco está en ~/.hostsuar/redis/datos y cuenta en el espacio de tu plan, también con el Redis parado. La tarjeta del Gestor de paquetes enseña cuánto ocupa, junto a la memoria. Colas y sesiones suelen quedarse en unos pocos megas: el fichero de registro se compacta solo cuando crece.

Al llenarse.

  • No perder datos (por defecto): cuando llega al límite, rechaza las escrituras nuevas con un error y no borra nada. Es la opción para colas, sesiones y Horizon: la aplicación avisa del error en lugar de perder un trabajo sin que nadie lo sepa.
  • Descartar lo menos usado: borra las claves que menos se usan para hacer sitio. Solo para caché; con colas o sesiones perderías trabajos y desconectarías usuarios.

Cambiar los ajustes reinicia el Redis. Con Cada segundo recupera sus datos al volver; si pasas a Sin persistencia, arranca vacío.

Acciones

  • Ajustes: cambia memoria, persistencia y comportamiento al llenarse.
  • Reiniciar: lo para y lo arranca. Con persistencia, conserva los datos.
  • Vaciar: borra todo lo que contiene, en todas sus bases: trabajos pendientes de las colas, sesiones abiertas (los usuarios tendrán que volver a entrar) y métricas de Horizon. No se puede deshacer.
  • Desactivar: lo para y lo retira, así que libera su plaza de proceso persistente. La aplicación perderá la conexión: cambia antes su .env. Lo guardado se queda en tu cuenta por si lo vuelves a activar, salvo que marques Borrar también lo que tiene guardado.

Puedes comprobar que responde desde SSH, con tu usuario en lugar de USUARIO:

valkey-cli -s /home/USUARIO/.hostsuar/redis/redis.sock ping
valkey-cli -s /home/USUARIO/.hostsuar/redis/redis.sock info memory

El primero responde PONG; el segundo muestra la memoria usada (used_memory_human) y el límite (maxmemory_human).

Conectarlo desde Laravel

Activa la extensión redis (PhpRedis) en la versión de PHP de la aplicación y, si tus workers usan otra versión, también en esa. Después, en el .env:

REDIS_CLIENT=phpredis
REDIS_HOST=/home/USUARIO/.hostsuar/redis/redis.sock
REDIS_PORT=0
REDIS_PASSWORD=null

QUEUE_CONNECTION=redis
SESSION_DRIVER=redis

Sustituye USUARIO por tu usuario de cPanel. Con Deploy+, edita el .env desde el menú del repositorio; si cacheas la configuración, vuelve a ejecutar php artisan config:cache o despliega de nuevo. Comprueba la conexión:

php artisan tinker --execute="dump(Illuminate\Support\Facades\Redis::connection()->ping());"

Debe mostrar true.

Antes de cambiar de conexión, ten en cuenta lo que ya existe:

  • Colas: los trabajos que esperan en la base de datos no pasan a Redis. Deja que la cola de la base de datos se vacíe antes de cambiar QUEUE_CONNECTION, o mantén un rato un worker sobre la conexión database.
  • Sesiones: las sesiones guardadas en la base de datos no se trasladan. Al cambiar SESSION_DRIVER, los usuarios tendrán que volver a iniciar sesión.

Para procesar las colas hace falta un worker en marcha: créalo en Herramientas > Procesos como Worker de colas o usa Horizon. Lo tienes en procesos persistentes.

Con Redis Cache a la vez

Si quieres la caché en Redis Cache y el resto en el Redis persistente, haz que la conexión cache de config/database.php lea sus propias variables. En la conexión cache, cambia el host y el puerto:

'host' => env('REDIS_CACHE_HOST', env('REDIS_HOST', '127.0.0.1')),
'port' => env('REDIS_CACHE_PORT', env('REDIS_PORT', '6379')),

Y en el .env:

REDIS_HOST=/home/USUARIO/.hostsuar/redis/redis.sock
REDIS_PORT=0
REDIS_CACHE_HOST=/tmp/redis.sock
REDIS_CACHE_PORT=0
CACHE_STORE=redis

El almacén redis de config/cache.php usa la conexión cache para los datos y la default para los bloqueos, así que los bloqueos de Cache::lock() y withoutOverlapping() quedan en el Redis persistente, que no los descarta.

Si solo tienes el Redis persistente, deja la caché en la base de datos o, si la pones en Redis, dale caducidad a lo que guardes: con No perder datos, una caché que crece sin caducar acaba llenando la memoria y bloqueando también las colas.

Horizon

Horizon necesita colas en Redis y un proceso que lo mantenga en marcha:

  1. Activa el Redis persistente y conecta Laravel como en el apartado anterior, con QUEUE_CONNECTION=redis.
  2. Instala Horizon en tu proyecto con composer require laravel/horizon y php artisan horizon:install. Necesita las extensiones pcntl y posix: si Composer avisa de que faltan, actívalas en la versión de PHP que vas a usar.
  3. Revisa config/horizon.php. El supervisor de production admite por defecto hasta 10 workers, y cada uno ocupa su memoria dentro de los recursos de tu cuenta: ajusta maxProcesses a lo que necesita tu aplicación, por ejemplo 2 o 3 en Avanza.
  4. Decide quién puede ver el panel /horizon en el método gate() de app/Providers/HorizonServiceProvider.php. Fuera del entorno local, solo entra quien autorices ahí.
  5. En Herramientas > Procesos, añade un proceso de tipo Horizon con la carpeta de la aplicación y su versión de PHP. No crees además un worker de colas para las mismas colas.
  6. Añade php artisan horizon:terminate al final del script de Deploy+, para que Horizon vuelva a arrancar con el código nuevo tras cada despliegue.
  7. Si quieres las gráficas de métricas, programa horizon:snapshot cada cinco minutos en routes/console.php:
use Illuminate\Support\Facades\Schedule;

Schedule::command('horizon:snapshot')->everyFiveMinutes();

Horizon con Redis Cache no es seguro: si esa caché se vacía o se llena, se pierden trabajos pendientes.

Copias de seguridad

Los datos viven en tu cuenta, en ~/.hostsuar/redis/, y entran en las copias de seguridad diarias como el resto de tus ficheros.

Restaurar esa carpeta devuelve el Redis al estado de ese día: los trabajos que estaban pendientes entonces volverían a la cola, aunque ya se hubieran procesado después. Si necesitas restaurarla, para antes el Redis persistente desde Herramientas > Procesos y arráncalo cuando termine la restauración.

También te puede ayudar

¿Algo no cuadra o ha cambiado? Cuéntanoslo y lo revisamos.