- Redis memorizza i dati nella memoria con strutture avanzate e operazioni atomiche.
- Supporta la persistenza (RDB/AOF), la replica asincrona e strumenti come Pub/Sub e Lua.
- Ideale per caching, sessioni, messaggistica e classifiche con latenze molto basse.
Se hai mai avuto bisogno che la tua applicazione funzionasse a razzo, probabilmente hai sentito parlare di Redis. Questa tecnologia funziona come un sistema di dati in memoria che offre latenze molto basse e risposte quasi istantanee, ideale quando la velocità è la priorità assoluta.
Redis è molto più di una semplice cache: si tratta di un database NoSQL chiave-valore con molteplici strutture dati e strumenti integrati. Lanciato originariamente nel 2009 e scritto in C, il suo nome deriva da Remote Dictionary Server . Oggi vanta un ecosistema molto attivo, client per quasi tutti i linguaggi di programmazione e solide funzionalità di persistenza e replica.
Che cos'è Redis e a cosa serve?
Redis è un motore di archiviazione in memoria che funziona con coppie chiave-valore e strutture avanzate. Operando nella RAM, riduce i colli di bottiglia tipici dell'accesso al disco , risultando perfetto per casi d'uso in cui è necessaria una velocità estrema: cache per query complesse, sessioni utente, messaggistica in tempo reale, giochi online, dashboard con dati in streaming e altro ancora.
In molti progetti, viene utilizzato come livello di cache davanti ai database tradizionali , memorizzando risultati ripetitivi per evitare continui ricalcoli o nuove query. Viene anche utilizzato come database stesso quando non è richiesta una durabilità rigorosa o quando la sua persistenza è configurata per garantire che i dati siano memorizzati su disco.
La sua architettura client/server, l'interfaccia di rete e il design leggero ne facilitano l'implementazione e la connessione da più host. Inoltre, offre una replica asincrona master-to-replica (il master continua a funzionare durante la replica), che contribuisce a scalare le operazioni di lettura e a migliorare la disponibilità.
Caratteristiche chiave
Il punto di forza principale di Redis è che tutto risiede nella memoria principale. Questo elimina gli accessi al disco durante le fasi critiche e garantisce operazioni di lettura/scrittura estremamente veloci . Inoltre, ogni stringa può raggiungere fino a 512 MB, con supporto per dati binari, e include strutture come liste, insiemi, insiemi ordinati, hash, HyperLogLog, bitmap e stream.
Redis implementa operazioni atomiche di alto livello lato server su queste strutture. Ciò consente di eseguire unioni, intersezioni o differenze su insiemi, modificare sottostringhe o incrementare e decrementare numeri interi e a virgola mobile senza condizioni di competizione.
Include strumenti che accelerano lo sviluppo e semplificano i modelli più comuni: Pub/Sub per la pubblicazione e la sottoscrizione ai canali (ideale per messaggistica e notifiche in tempo reale), chiavi con TTL per la scadenza automatica, contatori atomici per metriche e controllo della concorrenza e supporto integrato per script Lua per la logica lato server a partire dalla versione 2.6.
Un altro importante vantaggio è la sua compatibilità con i moduli. I moduli Redis estendono funzionalità come i documenti JSON , le serie temporali e la ricerca , rendendolo un sistema versatile che va ben oltre la semplice associazione chiave-valore.

Storia, licenze ed evoluzione
Redis è stato creato nel 2009 da Salvatore Sanfilippo per migliorare la latenza di un prodotto chiamato LLOGG. Il suo successo fu immediato e nel 2010 VMware assunse Sanfilippo per guidare il progetto a tempo pieno ; Pieter Noordhuis si unì al team poco dopo. Tra il 2013 e il 2015, il progetto è stato sponsorizzato da Pivotal e successivamente da Redis Labs.
Dalla versione 2.6, il server integra un interprete Lua, che consente l'esecuzione di script direttamente all'interno di Redis con atomicità e minimizzando la latenza di andata e ritorno client-server. Per quanto riguarda la licenza, è distribuito secondo un modello duale RSALv2 e SSPLv1.
Modello di dati e operazioni
Redis utilizza un dizionario globale che associa le chiavi ai valori. A differenza delle soluzioni più semplici basate su chiave-valore, i valori possono essere di diversi tipi. Il tipo determina i comandi disponibili e le operazioni atomiche che è possibile eseguire su quei dati.
Il tipo String di Redis è "a prova di dati binari": può contenere testo, numeri interi, numeri in virgola mobile o dati binari grezzi come un'immagine JPEG o un oggetto serializzato. È possibile operare su porzioni della stringa, modificare bit specifici o utilizzarla come un contatore con incrementi/decrementi.
Le liste consentono di gestire code o pile, i set e i set ordinati vengono utilizzati per l'appartenenza e la classificazione in base al punteggio, e gli hash memorizzano mappe campo-valore, molto utili per raggruppare gli attributi di un oggetto . HyperLogLog viene utilizzato per contatori di cardinalità approssimata con pochissima memoria e gli stream facilitano i flussi di eventi con consumo raggruppato.
Inoltre, Redis offre le transazioni (MULTI/EXEC), che consentono di raggruppare più operazioni da eseguire in sequenza e in modo atomico . In combinazione con Lua, è possibile incapsulare in modo affidabile logiche complesse lato server.
Persistenza: snapshot e AOF
Redis può operare interamente in memoria, ma supporta anche la persistenza su disco per bilanciare prestazioni e durabilità. Grazie agli snapshot (RDB), acquisisce periodicamente istantanee del dataset e le salva in modo asincrono, riducendo al minimo l'impatto sui tempi di risposta.
L'altra opzione è AOF (journaling), che registra ogni operazione di scrittura su un file. Questa modalità offre una durabilità più precisa e configurabile: `appendfsync=always` forza la sincronizzazione a ogni modifica (massima sicurezza, prestazioni inferiori), mentre `appendfsync=everysec` sincronizza ogni secondo (ottimo compromesso).
Se necessario, è possibile anche avviare un salvataggio manuale per forzare la creazione immediata di un'istantanea. In caso di guasto totale del computer, in genere si perderà al massimo una piccola quantità di dati, a seconda dei criteri di sincronizzazione scelti.
Nelle versioni precedenti, a partire dalla versione 2.4 era consentito l'utilizzo della "memoria virtuale", ma tale approccio è ormai obsoleto. Oggi si consiglia di scegliere tra RDB, AOF o una combinazione di entrambi , adattando la configurazione in base alla criticità dei dati e alle prestazioni desiderate.
Replicazione e alta disponibilità
Redis implementa la replica asincrona master-replica. Ciò significa che le operazioni di scrittura vengono accettate sul master e le repliche vengono sincronizzate senza bloccarlo, mantenendo il servizio operativo durante le sincronizzazioni . Un master può avere più repliche e, a sua volta, una replica può essere concatenata come master di un'altra replica, formando una topologia ad albero.
La replica è molto utile per scalare le operazioni di lettura e per garantire la ridondanza. Alcune configurazioni consentono la scrittura sulle repliche, sebbene ciò possa portare a incoerenze se non gestito correttamente; per impostazione predefinita, le repliche vengono solitamente utilizzate in modalità di sola lettura per mantenere la coerenza.
Posizionare le repliche vicino agli utenti riduce la latenza percepita. Grazie all'orchestrazione e agli strumenti sentinel/cluster, è possibile ottenere alta disponibilità e failover automatico per ridurre al minimo i tempi di inattività in caso di guasto del server master.
Architettura ed ecosistema client/server
Il server Redis espone un protocollo semplice a cui si connettono client di diversi linguaggi di programmazione. È possibile interagire con la sua interfaccia a riga di comando ufficiale (redis-cli) per test, amministrazione o scripting rapido, oppure integrare una libreria nella propria applicazione.
Sono disponibili client per ActionScript, C, C++, C#, Java, Go, Python, PHP, Ruby, Scala, JavaScript (incluso Node.js lato server), R, Erlang, Haskell, Lua, Objective-C, Perl, Common Lisp, Smalltalk, Tcl, Io, haXe, Pure Data e molti altri. Questo ampio supporto ne facilita l'adozione in quasi tutti gli stack tecnologici.
Casi d'uso reali ed esempi pratici
Un esempio molto comune è quello di un'agenzia immobiliare online: l'annuncio di un immobile, con il suo prezzo, i servizi e il numero di stanze, cambia raramente. Senza la cache, ogni visita richiede ripetute query e calcoli. Con Redis, dopo il primo caricamento, l'oggetto viene salvato con una chiave (ad esempio, property_4056 ) e un TTL di, diciamo, un mese. Le visite successive leggono dalla memoria ed evitano di accedere al database.
È inoltre comune memorizzare nella cache i risultati di report complessi , gestire sessioni autenticate, creare classifiche in tempo reale con set ordinati o utilizzare Pub/Sub come canale di messaggistica leggero tra i servizi.
In un test condotto utilizzando una tabella di errori di 16.000 righe, sono stati misurati i tempi di: 1) interrogazione del database, 2) salvataggio della raccolta in Redis e 3) lettura da Redis. Il risultato è stato sorprendente: il recupero da Redis è risultato 26 volte più veloce rispetto al recupero dal database. Questi confronti spesso mettono in luce l'impatto reale sull'esperienza utente e sui costi dell'infrastruttura.
Redis contro Memcached
Entrambe le tecnologie vengono utilizzate per la memorizzazione nella cache in memoria, ma presentano differenze significative. Redis offre diversi tipi di dati (liste, insiemi, hash, ecc.), persistenza su disco opzionale , Pub/Sub, script Lua, transazioni e moduli per estenderne le funzionalità. Memcached, d'altro canto, si concentra su un semplice modello chiave-valore in memoria senza persistenza.
In termini di prestazioni pure, entrambi sono molto veloci; Redis tende a eccellere in scenari con strutture complesse e operazioni atomiche lato server. Se hai bisogno solo di una cache molto semplice e ultraleggera, Memcached potrebbe bastare , ma quando cerchi maggiore funzionalità e flessibilità, Redis di solito risulta superiore.
Servizi gestiti vs. autogestiti (Redis e Valkey)
È possibile installare Redis o Valkey autonomamente oppure optare per un servizio cloud gestito. L'autogestione offre il controllo completo, ma la scalabilità e la manutenzione (aggiunta di nodi, aggiornamenti, sicurezza, backup, monitoraggio) sono di vostra responsabilità.
Un servizio gestito riduce l'onere operativo: scalabilità più semplice, elevata disponibilità e aggiornamenti senza problemi. Questo si traduce in genere in un costo totale di proprietà inferiore e consente al team di concentrarsi maggiormente sulla modellazione dei dati e sulle funzionalità aziendali, anziché sulle attività relative alla piattaforma.
Strumenti integrati: Pub/Sub, TTL, contatori e Lua
Con Pub/Sub, è possibile trasmettere messaggi in canali e farli ricevere istantaneamente a più iscritti, il che è perfetto per chat, notifiche e coordinamento tra microservizi. È un modello semplice ed efficace.
Le chiavi Time-to-live (TTL) consentono di "autopulire" i dati temporanei: sessioni, token, risultati di query scaduti, ecc. Ciò impedisce di riempire il database con informazioni obsolete e semplifica la logica di scadenza.
I contatori atomici sono ottimi per metriche, limitazione della frequenza, code o in qualsiasi caso in cui sia necessario aggiungere/sottrarre in modo sicuro in ambienti concorrenti.
Infine, il supporto integrato di Lua consente di eseguire script in prossimità dei dati con atomicità. Ciò riduce il traffico di rete e permette di eseguire operazioni complesse in un unico passaggio , migliorando la coerenza e le prestazioni.
Domande frequenti
A cosa serve Redis? Ad accelerare le applicazioni con cache in memoria, sessioni, classifiche in tempo reale, messaggistica leggera con Pub/Sub e come database NoSQL quando la latenza è critica o è configurata la persistenza.
Perché Redis è così veloce? Perché i dati risiedono nella RAM, eliminando gli accessi al disco nel percorso critico e offrendo operazioni atomiche lato server; inoltre, il suo protocollo è leggero ed efficiente.
Può essere utilizzato come database? Sì. Si tratta di un database NoSQL in memoria con opzioni di persistenza (RDB e AOF). A seconda della configurazione, è possibile dare priorità alle prestazioni o alla durabilità , oppure combinare entrambe.
Supporto linguistico
Esistono client maturi praticamente per ogni linguaggio: Python (redis-py), Java (Jedis), Node.js (ioredis), C#/.NET (StackExchange.Redis), PHP (phpredis), Go (go-redis), Ruby (redis-rb) e molti altri. Questa varietà garantisce una perfetta integrazione con il tuo stack tecnologico esistente.
Redis si è affermato come la soluzione "jolly" per risolvere i problemi di prestazioni e di elaborazione in tempo reale nella maggior parte delle architetture moderne: combina velocità fulminea, strutture dati complesse, persistenza configurabile, replica e una serie di strumenti pratici che, se usati correttamente, fanno la differenza nell'esperienza degli utenti.