Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Redis: un DBMS NoSQL a dizionario

Tra i tanti DBMS NoSQL disponibili, Redis è uno dei più interessanti: ecco un tutorial che ne spiega l'installazione, le funzionalità, l'uso ed i vantaggi.
Tra i tanti DBMS NoSQL disponibili, Redis è uno dei più interessanti: ecco un tutorial che ne spiega l'installazione, le funzionalità, l'uso ed i vantaggi.
Link copiato negli appunti

Redis è un DBMS NoSQL rilasciato per la prima volta nel 2009, di tipo “key/value storage”. Esso si basa infatti su una struttura a dizionario: ogni valore immagazzinato è abbinato ad una chiave univoca che ne permette il recupero.

Questo progetto si è guadagnato un posto di spicco tra i database NoSQL grazie ad alcuni vantaggi di rilievo:

  • estrema velocità: Redis conserva i dati in memoria RAM, salvandoli in maniera persistente solo in un secondo momento. Ciò permette di ottenere ottime prestazioni in scrittura e lettura;
  • dispone di una grande varietà di tipi di dato. Quindi nonostante l'architettura dell'archivio sia basata su una struttura a dizionario, i valori possono assumere varie forme: liste, dizionari stessi, e molto altro. Da questo punto di vista, Redis può essere visto come un gestore di strutture dati persistenti;
  • tutte le operazioni sono atomiche, quindi in caso di accessi concorrenti da parte di più client, i dati forniti risulteranno sempre aggiornati;
  • possibilità di implementare configurazioni multi-nodo, cluster e replication.

L'articolo introduce il lettore all'utilizzo pratico di Redis, dall'accesso interattivo da riga di comando all’utilizzo delle API, fino ad arrivare alle
configurazioni in cluster.

Installazione e primi comandi

La prima cosa di cui abbiamo bisogno è un'installazione completa di Redis. Le principali distribuzioni Linux offrono pacchetti
precompilati che rendono questo procedimento abbastanza agevole.

L'ambiente di test che abbiamo utilizzato per la stesura di questo articolo è basato su Ubuntu Server 14.04. Per ottenere Redis su questo sistema operativo
è sufficiente il seguente comando da terminale:

[code]apt-get install redis-server[/code]

In alternativa a questo metodo, si può procedere al download dei sorgenti da un'apposita pagina del sito ufficiale.

L'archivio ottenuto deve essere quindi scompattato, e si potrà avviare la compilazione:

[code]
tar xzf redis-2.8.17.tar.gz
cd redis.2.8.17
make
[/code]

I comandi appena illustrati fanno riferimento alla versione 2.8.17 di Redis, quella attualmente stabile. Tale numero di versione dovrà, ovviamente, essere
adattato a quello dell’ultimo rilascio al momento dell'utilizzo.

Qualunque percorso si sia seguito per ottenere il DBMS funzionante, si avrà a disposizione anche un client testuale interpellabile da riga di comando: redis-cli.

La prima prova che si può eseguire è la più naturale per un sistema basato sul meccanismo chiave/valore:

[code]
> redis-cli
127.0.0.1:6379> set nome Carlo

OK

127.0.0.1:6379> GET nome

"Carlo"
[/code]

All'invio del comando redis-cli, si viene accolti da un altro prompt che riporta indirizzo IP del server (in questo caso lavoriamo in locale) e la porta
TCP utilizzata, di default la 6379.

Come tutte le strutture dizionario, esistono due comandi principali: uno per inserire una nuova chiave valore (SET) ed una per recuperare il valore in base
alla chiave (GET).

In questo caso, abbiamo inserito il valore “Carlo” in corrispondenza della chiave nome.

Altri comandi particolarmente utili per la gestione delle chiavi sono i seguenti:

Comando Descrizione
DEL nome_chiave Cancella il valore corrispondente alla chiave
DUMP nome_chiave Espone una versione serializzata del valore corrispondente alla chiave
EXISTS nome_chiave Verifica l'esistenza della chiave. Ritorna un valore intero pari a 1 in caso affermativo, 0 in caso negativo
EXPIRE nome_chiave numero_secondi Consente di specificare dopo quanti
secondi la chiave cessa di esistere
EXPIREAT nome_chiave timestamp Specifica un timestamp come scadenza della chiave
PEXPIRE nome_chiave numero_millisecondi Come EXPIRE, ma il tempo è specificato in millisecondi
PEXPIREAT nome_chiave timestamp Come EXPIREAT, ma il timestamp è specificato in millisecondi
PERSIST Rimuove la scadenza dalla chiave

Quando nel seguito parleremo di file di configurazione di Redis, ci si riferirà al file denominato redis.conf, disponibile nella cartella
/etc del sistema operativo, o all'interno dei sorgenti di cui si è eseguita la compilazione: dipenderà dalla modalità di installazione che abbiamo scelto.

Nonostante il vasto utilizzo dello storage in RAM, l'attuazione di una vera persistenza su memoria di massa resta un compito importante di Redis per garantire il mantenimento del database in casi di riavvio del server, interruzione dell'erogazione di energia elettrica e guasti hardware.

Persistenza

Redis dispone di due meccanismi di persistenza:

  • RDB (attuato di default): consiste in una sorta di snapshot che crea un salvataggio su disco dei dati immagazzinati nel server.
  • AOF (Append Only File): crea un file di log continuo ove vengono registrate tutte le operazioni di modifica inviate al server.

Esaminiamoli in dettaglio.

RDB

Questo meccanismo scatta in determinati momenti impostati nel file di configurazione mediante la direttiva save.

Ad esempio, l'impostazione:

save 900 1

indica che lo snapshot verrà realizzato ogni 900 secondi a patto che sia stata svolta almeno una modifica di chiave.

Il rischio principale che si corre con RDB si concretizza nel caso in cui l'interruzione improvvisa del server Redis impedisce di salvare in maniera persistente le modifiche ai dati dopo l'ultimo snapshot. Per ridurre la gravità di tale inconveniente, si predispongono più direttive save nel file di configurazione.

Queste le direttive inserite di default:

save 900 1
save 300 10
save 60 10000

Come si vede all'aumentare dell'intervallo di tempo indicato si associa un maggior numero di modifiche effettuate richieste;

AOF

Questo file permette, al riavvio del server, di ripristinare in memoria l'ultimo dataset salvato su disco. Il sistema crea file meno compatti rispetto a RDB, ma il rischio di perdite di dati si riduce.

AOF si può attivare da file di configurazione mediante la riga:

appendonly yes

Di default, questo meccanismo è disattivato.

Come utilizzare i meccanismi di persistenza

Se siamo disposti a tollerare eventuali perdite di dati inseriti negli ultimissimi minuti, il solo RDB può andare bene. Si può comunque attuare entrambi i meccanismi di persistenza contemporaneamente, per fare in modo che l'uno colmi le carenze dell'altro. Questa configurazione conferirebbe a Redis un’affidabilità comparabile a quella dei grandi DBMS relazionali.

Viceversa, se vogliamo ottenere un DBMS velocissimo che opera solo su RAM possiamo disabilitare entrambe le opzioni, commentando le direttive citate - save e appendonly.

Come ultima nota vale la pena sottolineare che la documentazione ufficiale raccomanda vivamente di effettuare frequenti backup del database, e a tale scopo RDB è sicuramente il più adatto. La compattezza del file di snapshot prodotto permette un comodo backup su un altro server o su Cloud mediante job schedulati nel tempo. Il tutto viene reso possibile dall'organizzazione di Redis che non scrive mai sul file RDB, al momento del salvataggio dei dati. Ne viene infatti creata una copia che solo al termine dell'operazione prende il posto della versione precedente. Quindi, in definitiva, un file RDB può in ogni momento essere oggetto di backup locale o remoto.

Tipi di dato

Una caratteristica di Redis molto interessante è la varietà di tipi di dato che mette disposizione. Il valore archiviato in corrispondenza di una chiave può essere anche abbastanza diverso da una stringa e soprattutto può rappresentare esso stesso una struttura dati.

La grande duttilità di questi formati non si dimostra semplicemente con la loro varietà ma soprattutto con il gran numero di funzioni a corredo che ne permettono la manipolazione.

Qui di seguito vengono schematicamente indicati i tipi di dato a disposizione, ma una descrizione più completa può essere ricavata dalla documentazione ufficiale:

Tipo di dato Descrizione
Stringhe rappresentano uno dei più semplice tipi di dato. In realtà sono molto flessibili, in quanto possono contenere qualsiasi dato, anche in formato binario, essendo binary safe. La loro dimensioni può arrivare a 512 MB
Liste le liste rappresentano un elenco di stringhe indicizzate in base all'ordine di inserimento nella struttura. Possono essere modificate con inserimenti in testa o in coda e per crearle è sufficiente inserire tramite i comandi delle liste (LPUSH o RPUSH) più valori con la stessa chiave
Set (insiemi) sono collezioni non ordinate di valori. La loro particolarità è che, a differenza delle liste, non ammettono duplicati
Hash È un oggetto dizionario. Anch’esso, come la macrostruttura che sta alla base di Redis, funziona con lo storage di tipo chiave/valore. È l'ideale per rappresentare degli oggetti come insieme di proprietà
Sorted set (Insiemi ordinati) Sono una versione modificata dei Set. Continuano ad essere insiemi di stringhe che non ammettono duplicati ma, in più, includono un valore detto score associato ad ogni elemento, in base al quale è possibile ordinare in senso sia ascendente che discendente i valori dell'insieme

Più che approfondire la presentazione, passiamo subito ad un esempio pratico, effettuando alcune operazioni su una lista.

Dopo avere avviato l'interazione con Redis mediante il comando redis-cli, digitiamo quanto segue:

127.0.0.1:6379> LPUSH animali cane
(integer) 1
127.0.0.1:6379> LPUSH animali gatto
(integer) 2
127.0.0.1:6379> LPUSH animali topo
(integer) 3
127.0.0.1:6379> LPUSH animali cavallo
(integer) 4
127.0.0.1:6379> LPUSH animali gallina
(integer) 5

Abbiamo così creato una lista di nomi di “animali”, senza dichiararla ma semplicemente inserendovi valori. Ad ogni inserimento operato in testa tramite il comando LPUSH, Redis risponde con un numero intero che rappresenta la dimensione raggiunta dalla lista.

Altri comandi permettono di estrapolare informazioni dalla struttura dati così creata:

127.0.0.1:6379> LLEN animali
(integer) 5
127.0.0.1:6379> LRANGE animali 2 4
1) "topo"
2) "gatto"
3) "cane"
127.0.0.1:6379> LINDEX animali 3
"gatto"

[/code]

LLEN restituisce il numero di elementi che compongono la lista. LRANGE fornisce come risultato un segmento della lista, esattamente dalla posizione 2 alla 4. L'ultimo comando mostrato è LINDEX che restituisce il valore corrispondente alla posizione indicata della struttura dati.

Librerie client: programmare con Redis

Dato l'interesse suscitato da questo progetto nella comunità informatica, sono nate molte librerie per integrare Redis nei propri progetti software. Ne esistono di disponibili per un gran numero di tecnologie, tra le quali non potevano mancare le più utilizzate: Java, C, .NET, PHP (tra cui phpredis), Python (ricordiamo redis-py) e tantissimi altri.

A titolo di esempio, vedremo come utilizzare il client più popolare del mondo Java: Jedis (su GitHub), questa libreria necessita semplicemente di essere inclusa nel classpath del proprio progetto per essere utilizzata.

Le operazioni, data la struttura ed i formati disponibili in Redis, ricordano molto l'utilizzo di strutture dati associative (HashMap e le altre mappe) e sequenziali (liste, array, insiemi).

Per utilizzare questo driver Java, è sufficiente istanziare un oggetto di classe Jedis, specificandone i parametri di rete:

Jedis jedis = new Jedis("192.168.233.188");

In questo caso l'oggetto jedis rappresenta il ponte verso il servizio collocato all'indirizzo IP 192.168.233.188.

I metodi in esso inclusi rispecchiano i comandi del DBMS:

Comando Descrizione
jedis.ping() Effettua il ping sul servizio, che in caso di esito positivo risponde PONG
jedis.set("nome", "Carlo") Assegna il valore Carlo alla chiave nome
jedis.lpush("lista", new String[]{"cane","topo","gatto"});
jedis.lpush("lista", "cavallo");
Inserisce stringhe all'interno della struttura dati lista

Replication e configurazioni cluster

Oltre alle capacità di memorizzazione e di integrazione in progetti software, Redis risulta adatto anche a configurazioni più avanzate a nodo multiplo.

In primo luogo, dispone di un meccanismo fondamentale per la sicurezza delle basi di dati create: la replication. Intendiamo con questo termine la capacità di un DBMS di duplicare i propri database e affidarne una copia, costantemente aggiornata, ad un'altra sua istanza in esecuzione su una macchina diversa.

La complessità di questo meccanismo, com’è facile immaginare, risiede nel modo in cui tutte le copie dei dati restino allineate ed aggiornate tra loro, facendo in modo che un dato inserito in una venga prontamente replicato sulle altre. Lo scopo di una tecnica simile è innanzitutto la ridondanza dei dati. Ciò garantisce la sopravvivenza del sistema informativo anche in caso di guasti hardware o problemi software.

Inoltre, configurazioni più avanzate della replication potrebbero prestarsi a finalità diverse. Un esempio potrebbe essere il bilanciamento del carico: di tante repliche dello stesso database una potrebbe essere interessata da operazioni di scrittura mentre le operazioni di lettura verrebbero distribuite sulle altre in maniera uniforme.

I ruoli nella replication sono due: master, il server che offre il database, e slave, quello che lo replica. La configurazione della replication è immediata. Le istanze che svolgeranno il ruolo di slave dovranno riportare nel file di configurazione un'indicazione simile:

slaveof ip_master port_master

dove i parametri ip_master e port_master saranno sostituiti, rispettivamente, dall'indirizzo IP e dalla porta TCP su cui sarà disponibile l'istanza master di Redis.

Redis può anche sfruttare installazioni in cluster. Tale modalità permette di attuare il data sharding, una forma di scalabilità orizzontale per cui il database viene suddiviso in una molteplicità di nodi di rete. Il principale vantaggio di tale tecnica – già inclusa nel progetto ma in continua evoluzione – consiste nella suddivisione automatica dell'intero dataset su macchine differenti, aumentando sicurezza e disponibilità dei dati.

Nell'installazione in cluster, ogni server Redis sfrutta contemporaneamente due porte TCP: una per l'interazione con i client ed un'altra scelta sommando la precedente con il numero 10000. Lo scopo di quest'ultima è il dialogo con gli altri nodi del cluster. Se, ad esempio, si usa come porta principale la tipica 6379, quella secondaria sarà la 16379.

I passi che portano alla realizzazione di un cluster Redis sono ilustrati in un tutorial presente sul sito ufficiale i cui punti salienti sono:

1. Devono essere predisposte obbligatoriamente almeno tre installazioni master. Per realizzare test di apprendimento, le varie istanze di Redis possono essere predisposte anche sulla stessa macchina, purché operanti su porte TCP distinte.

2. Per ogni installazione deve essere predisposto un file di configurazione in cui si definisca una porta TCP (mediante la direttiva port) e tre impostazioni che abilitino e configurino il cluster:

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

Il file nodes.conf qui utilizzato viene creato ed aggiornato da Redis quando necessario, pertanto non deve mai essere modificato manualment.

3. È consigliabile che per l'esecuzione si scarichino i sorgenti dell'ultima versione unstable su GitHub, e se ne proceda all'installazione come spiegato in precedenza in questo articolo.

4. Una volta pronte, le istanze del server devono essere mandate in esecuzione.

5. Infine, la configurazione cluster va attivata con lo script redis-trib.rb, presente nella cartella src dei sorgenti. Nel tutorial ufficiale viene indicato il comando per l'avvio della configurazione:

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

La parola chiave create indica che il cluster dev'essere creato, mentre il termine -replicas 1 specifica che ogni nodo deve essere replicato da uno slave.

L'elenco di endpoint che segue contiene le coordinate nella rete di ogni istanza: tutte rispondono allo stesso indirizzo IP ma ognuno con una propria porta TCP.

Conclusioni

Il progetto Redis può vantarsi di essere una delle realtà più promettenti nella propria categoria di DBMS NoSQL. Le linee di evoluzione suggeriscono inoltre imminenti novità importanti, relative soprattutto alle tematiche più delicate:

  • prestazioni;
  • gestione dei meccanismi di persistenza con una possibile integrazione tra RDB ed AOF;
  • perfezionamento dell'implementazione di architetture cluster, uno degli aspetti che maggiormente proietta un sistema di storage negli usi di produzione più competitivi.

Molto interessante è anche seguire lo sviluppo dei vari progetti client. La comodità e le prestazioni di Redis lo rendono un ottimo candidato a costituire il backend di qualunque applicazione. Un aspetto che in molti casi appare arduo è la scelta di una libreria tra la moltitudine esistente. Dovrebbero sempre essere prediletti i progetti che mostrano una certa continuità nella manutenzione da parte del team di sviluppo ed un costante arricchimento di funzionalità che rispecchi le novità costantemente introdotte in Redis.

Ti consigliamo anche