Per molti anni Redis è stato uno dei database in memoria più utilizzati per cache, code, contatori e applicazioni in tempo reale. Oggi esiste un’alternativa compatibile e governata dalla comunità: Valkey.
In questo articolo vedremo che cos’è Valkey, a cosa serve, come installarlo e come utilizzarlo con alcuni esempi pratici.
Che cos’è Valkey?
Valkey è un database key-value in memoria, progettato per rispondere molto rapidamente alle richieste. I dati vengono organizzati come coppie:
chiave → valorePer esempio:
utente:42 → "Maria"A differenza di un database relazionale tradizionale, Valkey non lavora principalmente con tabelle e righe. Offre invece diverse strutture dati native, tra cui:
- stringhe;
- liste;
- insiemi;
- insiemi ordinati;
- hash;
- stream;
- contatori;
- chiavi con scadenza automatica.
Il progetto è nato come fork di Redis prima del passaggio di Redis a nuove licenze “source available”. Valkey è sviluppato sotto l’egida della Linux Foundation e utilizza una licenza BSD, permissiva e adatta anche a progetti commerciali.
In pratica, Valkey conserva gran parte dell’esperienza d’uso di Redis: stesso protocollo di comunicazione, comandi molto simili e compatibilità con numerose librerie già esistenti.
A cosa serve Valkey?
Cache
È l’utilizzo più comune. Un’applicazione può salvare temporaneamente il risultato di un’operazione costosa, come una query al database o la generazione di una pagina.
database → applicazione → ValkeyLa prima volta l’applicazione calcola il risultato e lo salva in Valkey. Le richieste successive possono recuperarlo rapidamente dalla cache.
Sessioni utente
Valkey è utile per conservare le sessioni di accesso:
sessione:abc123 → utente 42, autenticato, carrello...Questo è particolarmente comodo quando un’applicazione è distribuita su più server.
Code di lavoro
Una lista Valkey può rappresentare una coda. Un processo inserisce i lavori e uno o più worker li estraggono per elaborarli.
Alcuni esempi:
- invio di email;
- ridimensionamento di immagini;
- elaborazione di video;
- generazione di report;
- esecuzione di attività asincrone.
Contatori e classifiche
I contatori atomici sono utili per:
- visualizzazioni di una pagina;
- voti;
- tentativi di accesso;
- numero di download;
- classifiche di videogiochi.
Dati temporanei
Con una scadenza, una chiave può essere eliminata automaticamente dopo un certo periodo:
codice-verifica:789 → 482931
scadenza: 5 minutiQuesto evita di dover eliminare manualmente dati temporanei.
Valkey è un database tradizionale?
Non esattamente. Valkey è più vicino a un data store in memoria che a un database relazionale come PostgreSQL o MariaDB.
I suoi principali punti di forza sono:
- bassa latenza;
- elevato numero di operazioni al secondo;
- strutture dati flessibili;
- comandi atomici;
- supporto alla replica e al clustering;
- possibilità di impostare una scadenza sulle chiavi.
Non è però sempre il sostituto ideale di un database relazionale. Per dati finanziari complessi, relazioni tra molte entità o query articolate, PostgreSQL o sistemi analoghi restano spesso più adatti.
Valkey può affiancare il database principale:
PostgreSQL → dati permanenti
Valkey → cache, sessioni, code e dati temporaneiInstallare Valkey con Docker
Il modo più rapido per fare una prova locale è utilizzare Docker:
docker run -d \
--name valkey \
-p 6379:6379 \
valkey/valkey:latestIl server sarà disponibile sulla porta 6379, quella tradizionalmente utilizzata anche da Redis.
Per verificare che il container sia in esecuzione:
docker psÈ possibile aprire una shell all’interno del container e usare il client di Valkey:
docker exec -it valkey valkey-cliA questo punto si può eseguire il primo test:
127.0.0.1:6379> PING
PONGPer fermare il container:
docker stop valkeyPer rimuoverlo:
docker rm valkeyQuesta configurazione è adatta a test e sviluppo. In produzione è necessario occuparsi anche di autenticazione, persistenza, backup, rete e monitoraggio.
Installazione da codice sorgente
Su un sistema Linux è possibile compilare Valkey dai sorgenti. Dopo aver scaricato il codice, la procedura essenziale è:
makeAl termine, il server e il client saranno disponibili nella directory src.
Per avviare Valkey:
src/valkey-serverIn un altro terminale si può utilizzare il client:
src/valkey-cliPer installare i programmi in /usr/local/bin:
sudo make installIl progetto mette a disposizione anche uno script per configurare un’installazione più completa su Ubuntu e Debian:
cd utils
sudo ./install_server.shI primi comandi
Una volta aperto valkey-cli, possiamo salvare una stringa:
SET nome "Ada"Risultato:
OKPer leggerla:
GET nomeRisultato:
"Ada"Per eliminare la chiave:
DEL nomePossiamo verificare se una chiave esiste:
EXISTS nomeE controllare quali chiavi sono presenti:
KEYS *Il comando KEYS * è comodo durante i test, ma va evitato su database di produzione con molte chiavi, perché può bloccare il server mentre analizza l’intero spazio dei nomi. In produzione è preferibile usare SCAN.
Scadenza automatica delle chiavi
Una chiave può avere una durata limitata usando EXPIRE:
SET messaggio "Questo dato dura poco"
EXPIRE messaggio 60La chiave scadrà dopo 60 secondi.
Per conoscere i secondi rimanenti:
TTL messaggioÈ anche possibile impostare la scadenza direttamente con SET:
SET codice 482931 EX 300In questo esempio il codice sarà conservato per 300 secondi, cioè cinque minuti.
Contatori atomici
Valkey può incrementare un numero senza che l’applicazione debba prima leggerlo e poi riscriverlo:
INCR visiteLa prima esecuzione restituisce:
(integer) 1Una seconda esecuzione restituisce:
(integer) 2Questo comportamento è utile quando più utenti aggiornano contemporaneamente lo stesso contatore.
Per aggiungere un valore specifico:
INCRBY visite 10Hash: dati organizzati per campi
Gli hash permettono di rappresentare un piccolo oggetto:
HSET utente:42 nome "Maria" email "maria@example.org" ruolo "editor"Per leggere un campo:
HGET utente:42 nomePer leggere tutti i campi:
HGETALL utente:42Il risultato sarà simile a:
1) "nome"
2) "Maria"
3) "email"
4) "maria@example.org"
5) "ruolo"
6) "editor"Questo modello è utile per sessioni, profili utente e impostazioni applicative.
Liste e code
Una lista può essere usata come una coda di lavoro.
Inseriamo due attività:
LPUSH lavori "invia-email"
LPUSH lavori "genera-report"Un worker può estrarre l’attività più recente:
RPOP lavoriPer attendere finché non arriva un elemento:
BRPOP lavori 0Il valore 0 significa che il comando resta in attesa senza limite di tempo.
Una coda molto semplice può quindi funzionare così:
producer → LPUSH lavori "nuovo lavoro"
worker → BRPOP lavori 0Insiemi e insiemi ordinati
Gli insiemi, o set, contengono elementi senza duplicati:
SADD linguaggi Python
SADD linguaggi Rust
SADD linguaggi PythonAnche se Python viene aggiunto due volte, comparirà una sola volta.
Per leggere gli elementi:
SMEMBERS linguaggiGli sorted set, invece, associano ogni elemento a un punteggio. Sono utili per creare classifiche:
ZADD classifica 1500 alice
ZADD classifica 1720 bob
ZADD classifica 1600 carloPer ottenere la classifica dal punteggio più alto al più basso:
ZREVRANGE classifica 0 -1 WITHSCORESUsare Valkey da Python
Per collegarsi da Python si può utilizzare il pacchetto redis, compatibile con il protocollo di Valkey in molti casi:
pip install redisEcco un esempio:
import redis
client = redis.Redis(
host="localhost",
port=6379,
decode_responses=True,
)
client.set("saluto", "Ciao da Valkey!")
valore = client.get("saluto")
print(valore)L’output sarà:
Ciao da Valkey!Un esempio con scadenza:
client.setex("codice-verifica", 300, "482931")La chiave codice-verifica verrà eliminata automaticamente dopo cinque minuti.
Un contatore:
numero = client.incr("visite")
print(f"Visite: {numero}")Un hash:
client.hset(
"utente:42",
mapping={
"nome": "Maria",
"ruolo": "editor",
},
)
utente = client.hgetall("utente:42")
print(utente)Valkey e compatibilità con Redis
Valkey conserva una forte compatibilità con il modello di Redis: protocollo, strutture dati principali e molti comandi sono gli stessi. Per questo diverse applicazioni possono essere migrate con modifiche limitate, soprattutto quando utilizzano funzionalità di base come cache, stringhe, liste, hash, set e sorted set.
La compatibilità, però, non significa che ogni caratteristica sia identica. Prima di una migrazione è necessario verificare:
- la versione utilizzata;
- i comandi effettivamente presenti nell’applicazione;
- eventuali moduli;
- il formato dei dati;
- la replica;
- il clustering;
- gli strumenti di monitoraggio e backup.
Le differenze aumentano quando si usano funzionalità specialistiche, come JSON, serie temporali, strutture probabilistiche, ricerca vettoriale o funzionalità avanzate di ricerca.
La strategia più prudente consiste nel testare la propria applicazione con Valkey prima di sostituire il servizio in produzione.
Persistenza: Valkey conserva i dati?
Sì, Valkey può salvare i dati su disco, anche se il suo punto di forza resta l’accesso in memoria.
Le principali modalità sono:
- snapshot RDB, che salvano periodicamente una fotografia dei dati;
- AOF, o Append Only File, che registra le operazioni eseguite;
- combinazioni delle due modalità.
La configurazione dipende dal livello di affidabilità richiesto. Per una semplice cache, la perdita dei dati può essere accettabile: se la cache viene svuotata, l’applicazione può ricostruirla.
Per una coda di lavoro o per dati importanti, invece, è necessario progettare con attenzione persistenza, replica e backup.
Valkey è adatto alla produzione?
Può esserlo, ma non basta avviare il server e lasciare la configurazione predefinita.
Prima di utilizzarlo in produzione conviene considerare:
- autenticazione e autorizzazioni;
- accesso limitato alla rete interna;
- cifratura del traffico, quando necessaria;
- persistenza;
- replica;
- backup;
- monitoraggio della memoria;
- limiti sulle dimensioni delle richieste;
- comportamento in caso di esaurimento della memoria;
- alta disponibilità e clustering.
È inoltre importante non esporre direttamente la porta 6379 su Internet. Il servizio dovrebbe essere raggiungibile soltanto dai componenti che ne hanno bisogno.
Valkey o Redis?
La scelta dipende dal progetto.
Valkey può essere una buona scelta quando:
- si desidera un progetto governato dalla comunità;
- si preferisce una licenza BSD;
- si usano soprattutto cache, sessioni, code e strutture dati di base;
- si vuole ridurre la dipendenza da un singolo fornitore;
- la compatibilità con Redis è sufficiente per il proprio caso d’uso.
Redis può essere più adatto quando servono funzionalità specifiche non presenti in Valkey o quando si desiderano determinati servizi gestiti e supporto commerciale.
La cosa importante è confrontare le funzioni realmente utilizzate dall’applicazione, non soltanto i nomi dei prodotti.
Conclusione
Valkey è un database in memoria veloce, flessibile e adatto a molti compiti pratici: dalla cache alle sessioni, dalle code ai contatori.
Il suo utilizzo di base è semplice:
SET chiave valore
GET chiave
DEL chiaveDietro questi pochi comandi c’è però un sistema capace di gestire strutture dati, scadenze, replica, persistenza e distribuzione su più nodi.
Per iniziare, Docker e valkey-cli sono sufficienti. Una volta compresi i comandi fondamentali, Valkey può diventare un componente utile in applicazioni web, sistemi distribuiti, API, piattaforme di analisi e servizi in tempo reale.