Salta al contenuto principale

Valkey: l’alternativa open source a Redis

Inviato da tuxsa il
Valkey logo

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 → valore

Per 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 → Valkey

La 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 minuti

Questo 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 temporanei

Installare Valkey con Docker

Il modo più rapido per fare una prova locale è utilizzare Docker:

docker run -d \
  --name valkey \
  -p 6379:6379 \
  valkey/valkey:latest

Il 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-cli

A questo punto si può eseguire il primo test:

127.0.0.1:6379> PING
PONG

Per fermare il container:

docker stop valkey

Per rimuoverlo:

docker rm valkey

Questa 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 è:

make

Al termine, il server e il client saranno disponibili nella directory src.

Per avviare Valkey:

src/valkey-server

In un altro terminale si può utilizzare il client:

src/valkey-cli

Per installare i programmi in /usr/local/bin:

sudo make install

Il progetto mette a disposizione anche uno script per configurare un’installazione più completa su Ubuntu e Debian:

cd utils
sudo ./install_server.sh

I primi comandi

Una volta aperto valkey-cli, possiamo salvare una stringa:

SET nome "Ada"

Risultato:

OK

Per leggerla:

GET nome

Risultato:

"Ada"

Per eliminare la chiave:

DEL nome

Possiamo verificare se una chiave esiste:

EXISTS nome

E 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 60

La chiave scadrà dopo 60 secondi.

Per conoscere i secondi rimanenti:

TTL messaggio

È anche possibile impostare la scadenza direttamente con SET:

SET codice 482931 EX 300

In 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 visite

La prima esecuzione restituisce:

(integer) 1

Una seconda esecuzione restituisce:

(integer) 2

Questo comportamento è utile quando più utenti aggiornano contemporaneamente lo stesso contatore.

Per aggiungere un valore specifico:

INCRBY visite 10

Hash: 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 nome

Per leggere tutti i campi:

HGETALL utente:42

Il 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 lavori

Per attendere finché non arriva un elemento:

BRPOP lavori 0

Il 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 0

Insiemi e insiemi ordinati

Gli insiemi, o set, contengono elementi senza duplicati:

SADD linguaggi Python
SADD linguaggi Rust
SADD linguaggi Python

Anche se Python viene aggiunto due volte, comparirà una sola volta.

Per leggere gli elementi:

SMEMBERS linguaggi

Gli 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 carlo

Per ottenere la classifica dal punteggio più alto al più basso:

ZREVRANGE classifica 0 -1 WITHSCORES

Usare Valkey da Python

Per collegarsi da Python si può utilizzare il pacchetto redis, compatibile con il protocollo di Valkey in molti casi:

pip install redis

Ecco 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 chiave

Dietro 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.