In questo articolo, introdurremo un DBMS divenuto una realtà molto importante del mondo NoSQL, Redis, e vedremo come sia agevole la sua integrazione in un’app Node.js. Redis appartiene alla tipologia key/value: l’intero database, in pratica, è una struttura a “dizionario” dove si immagazzinano valori associati ad una chiave univoca che ne permetterà un immediato recupero. Uno degli aspetti più importanti di Redis consiste nella sua capacità di immagazzinare come valori non solo semplici stringhe ma intere strutture dati tipo HashMap (strutture a dizionario esse stesse), liste, insiemi. Vediamo da vicino come funziona.
Iniziamo con Redis
Per prima cosa, scarichiamo ed installiamo Redis. Dalla pagina dei Downloads, otteniamo il pacchetto di sorgenti nella versione che desideriamo e, seguendo le istruzioni, lo decomprimiamo e compiliamo i sorgenti tramite il comando make.
Fatto ciò, nella cartella src troveremo il comando redis-server con cui attiveremo subito il server e redis-cli con cui interagiremo da riga di comando.
Una volta avviata la console redis-cli, potremo passare al server comandi la cui documentazione completa risiede in un’utile pagina riepilogativa presente sul sito ufficiale.
Di default, Redis possiede 16 database e dalla console, all’ingresso, si inizia ad interagire con il database numero 0 con la possibilità di cambiarlo all’occorrenza tramite il comando SELECT: ad esempio, digitando SELECT 1, inizieremo ad utilizzare il database numero 1.
Esistono molti altri comandi che agiscono sul server o sui singoli database e qui di seguito ne indichiamo alcuni che possono essere particolarmente utili nei primi approcci con Redis:
- INFO: informazioni complessive su tutti gli aspetti del server;
- DBSIZE: fornisce il numero di chiavi registrate attualmente nel database corrente;
- FLUSHDB: elimina tutti gli elementi registrati nel database corrente.
Quanto detto può essere utile per prendere confidenza con questo DBMS ma ora è il momento di iniziare ad inserirvi dei valori.
Primi dati in Redis
Dopo aver aperto la console di Redis, possiamo iniziare a vedere i casi più comuni di gestione dati:
- gestione di stringhe:
127.0.0.1:6379> set nome Paolo OK 127.0.0.1:6379> get nome "Paolo" 127.0.0.1:6379>
- gestione di hashmap:
127.0.0.1:6379> HMSET pagella 'Italiano' 8 'Storia' 9 'Matematica' 6 OK 127.0.0.1:6379> HGET pagella Matematica "6" 127.0.0.1:6379> HGETALL pagella 1) "Italiano" 2) "8" 3) "Storia" 4) "9" 5) "Matematica" 6) "6"
in questo modo creiamo una struttura dati a dizionario con chiave ‘pagella’ il cui valore contiene i nomi delle materie, come chiave, ed il voto conseguito come valore. Notare come vengono memorizzati i dati: in pratica, sembrano elencati come in una lista ma svolgono, alternatamente, il ruolo di chiave o di valore;
- ed infine vediamo le liste:
127.0.0.1:6379> RPUSH animali cane gatto topo mucca coniglio cavallo (integer) 6 127.0.0.1:6379> LRANGE animali 0 2 1) "cane" 2) "gatto" 3) "topo" 127.0.0.1:6379> LRANGE animali 0 -1 1) "cane" 2) "gatto" 3) "topo" 4) "mucca" 5) "coniglio" 6) "cavallo"
con le interazioni precedenti abbiamo creato una lista di sei elementi (tutte stringhe contenenti nomi di animali) e ne abbiamo estratto un subset. Il comando RPUSH inserisce valori in coda alla lista mentre LPUSH li avrebbe inseriti in testa.
Dopo aver effettuato questi ed altri esperimenti traendo spunto dalla documentazione ufficiale, si ricordi che si può vedere l’elenco di tutte le chiavi inserite tramite il comando KEYS, nella forma:
127.0.0.1:6379> KEYS *
Programmiamo con Redis in Node.js
Si potrebbe continuare a lungo a suggerire comandi da sperimentare sulla cli di Redis ma preferiamo passare ad un impiego legato già alla programmazione con Node.js. Creeremo del codice (scaricabile a questo link) che in poche righe ci permetterà di scaricare dati finanziari dal sito Yahoo! Finanza ed immagazzinarli in Redis. Il portale in questione permette di scaricare la quotazione attuale di un titolo azionario (ritardato di alcuni minuti) inviando una richiesta HTTP ad un indirizzo nel formato http://download.finance.yahoo.com/d/quotes.csv?s=CODICE&f=sl1d1t1c1ohgv&e=.csv dove, al posto della stringa CODICE, passeremo un identificativo che distingue, nei mercati azionari, il titolo che siamo interessati a monitorare.
Ad esempio, cercando il titolo relativo all’azienda Mediaset S.p.A. su Yahoo Finanza raggiungeremo la sua pagina (codice MS.MI) e scorrendola verso il basso, sulla destra, scorgeremo il link che permette di scaricare i dati:
Ai fini del nostro esercizio, tramite i comandi offerti dal browser, potremo leggere a quale indirizzo HTTP il link punti realmente e avremo conferma che segue proprio il formato che abbiamo descritto poco fa. Questi i dati ottenuti:
"MS.MI",2.28,"11/18/2016","5:41pm",-0.06,2.33,2.36,2.28,8057185
Una volta ottenuti, li interpreteremo nell’app Node.js prendendo il primo – il codice del titolo – pulendolo dai doppi apici ed il secondo che rappresenta il prezzo in euro equivalente. Fatto ciò, inseriremo il tutto in Redis usando il codice del titolo per formare la chiave ed il suo prezzo attuale come valore: questo ci consentirà di avere le quotazioni aggiornate continuamente nel nostro database.
In Node.js, faremo uso di due estensioni: node_redis per l’interazione con il database e request per un comodo scaricamento di dati da Internet. La loro installazione con npm segue le consuete modalità:
> npm init > npm install request redis --install > npm install request request --install
Questa la nostra app:
// inclusione moduli necessari
var redis = require('redis');
var request=require('request');
// definizione di un client Redis
var client = redis.createClient();
// gestione degli errori in Redis
client.on('error', function (err) {
console.log("Errore: Redis ha risposto "+err);
});
function nomeAzione(s)
{
// eliminiamo tutti gli apici dalla stringa
return s.replace(/"/g,'');
}
function creaIndirizzo(codice)
{
// inseriamo il codice del titolo azionario nell'indirizzo
return 'http://download.finance.yahoo.com/d/quotes.csv?s='+codice+'&f=sl1d1t1c1ohgv&e=.csv';
}
function scaricaDati(codice)
{
// scaricamento dati dal sito
request(creaIndirizzo(codice),
function (error, response, body) {
if (!error && response.statusCode == 200) {
// codice di risposta HTTP 200: tutto ok!
// costruiamo array con le parti della stringa separate da virgola
ar=body.split(',');
if (ar.length>1)
{
/* se l'array ha almeno due elementi assumiamo che il primo sia il nome del titolo
ed il secondo il suo valore: si possono effettuare ulteriori controlli sul formato */
nome=nomeAzione(ar[0]);
valore=ar[1];
// inseriamo in Redis la coppia nome titolo/valore
// N.B.: applichiamo il prefisso "stock:" per riconoscere queste chiavi nel db
client.set("stock:"+nome,valore, redis.print);
}
}
});
}
/* codici relativi ai titoli di nostro interesse:
Telecom Italia, Intesa San Paolo, ENI, Enel, Mediaset */
var daScaricare=['TIT.MI','ISP.MI','ENI.MI','ENEL.MI','MS.MI'];
// avvio del ciclo: scarichiamo i dati
daScaricare.forEach(function(v,i,a)
{
scaricaDati(v);
});
Un aspetto importante da notare è che utilizziamo come chiave per le strutture dati il codice del titolo anteponendo però il prefisso “stock:”: ciò al fine di poterlo riconoscere nel set di chiavi registrate nel database.
Il risultato sarà disponibile in Redis e potremo averne rapidamente dimostrazione tramite i seguenti comandi da client testuale:
127.0.0.1:6379> keys stock* 1) "stock:MS.MI" 2) "stock:ENEL.MI" 3) "stock:ENI.MI" 4) "stock:TIT.MI" 5) "stock:ISP.MI" 127.0.0.1:6379> GET stock:ENEL.MI "3.73"
Il codice dell’app è piuttosto breve consistendo solo nell’immagazzinamento di dati scaricati all’interno del database eppure ha il vantaggio di mostrare gli elementi salienti dell’interazione Node.js/Redis. Riassumiamoli:
- con il metodo createClient dell’oggetto redis stabiliamo la connessione che di default viene effettuata verso l’indirizzo localhost sulla porta TCP 6379 ma se si ha bisogno di specificare coordinate di rete differenti le si può passare come argomenti del metodo;
- in un normale array Javascript, di nome daScaricare, inseriamo i codici dei titoli che vogliamo monitorare e, subito dopo, con un ciclo forEach passiamo ognuno di essi al metodo scaricaDati che è il cuore dell’esperimento in quanto raccoglie sia l’interazione in rete che verso il database Redis;
- l’oggetto request ci permette di svolgere velocemente una lettura attraverso la rete richiedendo un URL da contattare ed un listener cui inviare il risultato.
Conclusioni
L’esempio può essere esteso con facilità. Ad esempio, si potrebbe creare delle API REST sfruttando Express e quanto appreso nei nostri tutorial precedenti. L’occasione comunque non mancherà visto che le potenzialità sono ancora notevoli ed il nostro discorso è appena iniziato: ben presto vedremo un utilizzo più articolato di queste due tecnologie insieme.
Alla prossima!












No Responses to “Redis: iniziamo ad usarlo con Node.js”