Se il tuo Laravel rallenta quando arrivano 50 utenti contemporanei, il problema non è il framework. Spesso è il driver di sessione, cache o coda che hai scelto. File, database, array: funzionano per lo sviluppo, ma in produzione ti strozzano. Noi, di Meteora Web, lo vediamo ogni giorno nei progetti che ci arrivano in consulenza. La soluzione si chiama Redis, e in Laravel è integrato alla perfezione. Vediamo come configurarlo e usarlo per session, cache e queue, con esempi che puoi copiare e mettere subito in produzione.
Perché Redis con Laravel conviene davvero
Redis è un database in memoria, velocissimo. In Laravel, puoi usarlo come driver per tre sistemi critici: sessioni, cache e code. Quando un utente fa una richiesta, la sessione letta da file o database aggiunge latenza. La cache in file system funziona ma scala male su più server. Le code con database diventano un collo di bottiglia. Redis risolve tutto con un unico servizio, persistente se vuoi, e con una latenza sotto il millisecondo.
Noi abbiamo scelto Redis per clienti con e-commerce in WooCommerce custom e piattaforme Laravel proprietarie. Il risultato? Tempi di risposta dimezzati, code processate in tempo reale, sessioni condivise tra server. E la configurazione è più semplice di quanto pensi.
Configurare Redis in Laravel
Installare e avviare Redis sul server
Prima di tutto, Redis deve essere installato. Su Ubuntu/Debian:
Sponsored Protocol
sudo apt update
sudo apt install redis-server
sudo systemctl enable redis-server
sudo systemctl start redis-server
Verifica che funzioni:
redis-cli ping
# Output: PONG
Per configurazioni più avanzate (persistenza, password, porte), vedi la documentazione ufficiale Redis.
Configurare Laravel per usare Redis
Laravel include già il supporto Redis via predis o phpredis. Noi consigliamo phpredis per performance migliori. Installalo:
sudo apt install php8.3-redis # adatta alla tua versione PHP
Poi nel .env del progetto:
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Nel file config/database.php troverai già la sezione redis. Noi la personalizziamo così:
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],
Nota la separazione tra connessione default e cache: usiamo database Redis diversi per evitare conflitti di chiavi.
Sponsored Protocol
Usare Redis per le Sessioni
Nel .env imposta:
SESSION_DRIVER=redis
Laravel userà Redis per memorizzare i dati di sessione. Il vantaggio è enorme: sessioni condivise tra più istanze del server (utile se usi load balancing) e velocità di lettura/scrittura quasi istantanea. Zero file I/O, zero query al database.
Errore comune: dimenticare di impostare un prefisso univoco per le chiavi Redis. Per evitare collisioni, aggiungi nel .env:
SESSION_CONNECTION=default
# oppure, se vuoi usare una connessione separata
# SESSION_CONNECTION=sessions
Noi di Meteora Web verifichiamo sempre che le sessioni funzionino anche dopo un deploy. Redis è persistente (se configurato) ma in produzione consigliamo di attivare RDB o AOF per non perdere sessioni in caso di crash. Vedi la guida alla persistenza Redis.
Usare Redis per la Cache
Driver e Store
Imposta nel .env:
Sponsored Protocol
CACHE_DRIVER=redis
Laravel supporta i cache tags con Redis. I tag ti permettono di invalidare gruppi di chiavi. Esempio pratico:
// Salva in cache con tag
Cache::tags(['products', 'prices'])->put('product_123', $data, 3600);
// Recupera
$product = Cache::tags(['products', 'prices'])->get('product_123');
// Invalida tutti i prezzi
Cache::tags(['prices'])->flush();
Questo è potente: puoi aggiornare una categoria intera senza sapere tutte le chiavi. Redis gestisce i tag con insiemi (set).
TTL e Cache Busting
Imposta tempi di scadenza adeguati. Per dati che cambiano raramente (es. configurazioni, liste di prodotti), usa TTL lunghi. Per dati volatili, TTL brevi. Noi usiamo un pattern: cache forever con invalidazione esplicita via eventi (es. model saved).
// App/Providers/EventServiceProvider.php
protected $listen = [
'eloquent.saved: App\Models\Product' => [
'App\Listeners\ClearProductCache',
],
];
// App/Listeners/ClearProductCache.php
public function handle(Product $product)
{
Cache::tags(['products'])->flush();
}
Usare Redis per le Queue
Le code in Laravel con driver database funzionano, ma non scalano. Ad ogni job, una query di insert e una di update. Con Redis, tutto in memoria, molto più veloce.
Configurazione nel .env:
Sponsored Protocol
QUEUE_CONNECTION=redis
Poi esegui il worker:
php artisan queue:work redis --sleep=3 --tries=3
Per gestire più code con priorità, definisci in config/queue.php:
'connections' => [
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
'after_commit' => false,
],
],
Puoi specificare code multiple: high, low, default. Poi nei job usa:
ProcessPodcast::dispatch()->onQueue('high');
E avvia i worker su code specifiche:
php artisan queue:work redis --queue=high,default
Laravel Horizon per la gestione avanzata
Per progetti seri, usa Horizon. È un pannello di controllo per Redis queue, sviluppato da Laravel. Installazione:
composer require laravel/horizon
php artisan horizon:install
Configura config/horizon.php per definire worker, bilanciamento, notifiche. Poi avvia:
php artisan horizon
Horizon ti dà metriche, fallimenti, velocità in tempo reale. Noi lo usiamo su tutti i progetti Laravel che superano i 10 job al minuto.
Errori comuni e come evitarli
- Connessione persa: Redis non è in esecuzione. Controlla con
systemctl status redise abilita il riavvio automatico. - Memoria esaurita: Redis ha una memoria limitata. Configura
maxmemoryemaxmemory-policy(es.allkeys-lru). - Chiavi che collidono: Usa prefissi univoci per ogni applicazione (vedi
REDIS_PREFIX). - Queue worker bloccato: Usa
supervisorper mantenere i worker attivi. Noi lo configuriamo in 5 minuti.
Monitoraggio e performance
Usa redis-cli MONITOR per vedere i comandi in tempo reale. Su Laravel, installa laravel/telescope per tracciare query Redis e job queue. Un comando utile per vedere le chiavi:
Sponsored Protocol
redis-cli --scan --pattern 'laravel_*'
In sintesi — cosa fare adesso
- Installa Redis sul tuo server e verifica con
redis-cli ping. - Imposta
SESSION_DRIVER=redis,CACHE_DRIVER=redis,QUEUE_CONNECTION=redisnel tuo.env. - Configura separatamente il database Redis per cache (
cacheconnection) e per sessioni/queue (default). - Se usi code, installa Horizon e configuralo con supervisor.
- Testa il tutto: apri il sito, verifica che le sessioni funzionino, la cache sia popolata, i job vengano processati.
Redis non è un optional per Laravel in produzione: è la scelta professionale. Noi, di Meteora Web, lo adottiamo in ogni progetto che performa. Se vuoi approfondire l'intero ecosistema di caching e Redis, leggi la nostra guida pillar su Redis e Caching Strategies. Per argomenti correlati, vedi anche Linux per Sviluppatori e Sysadmin.