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

Hash

Come rappresentare mappe e dizionari su Redis, utilizzando i cosiddetti hash: cosa sono, come si usano e quali sono le funzioni built-in per gestirli.
Come rappresentare mappe e dizionari su Redis, utilizzando i cosiddetti hash: cosa sono, come si usano e quali sono le funzioni built-in per gestirli.
Link copiato negli appunti

In Redis, è possibile utilizzare strutture dati associative, che permettono di realizzare ciò che in programmazione
viene comunenemente definito dizionario o mappa: tali struttore prendono il nome di hash.
Al loro interno, possiamo inserire valori associati ad una corrispondente chiave,
che ne permette l'identificazione ed il recupero immediato. Ci riferiremo con il termine entry ad una coppia
chiave/valore. Le chiavi devono essere assolutamente univoche, e vengono trattate
in maniera case-sensitive. Pertanto, nome e Nome saranno considerate due chiavi
distinte. Iniziamo una carrellata delle funzioni che Redis mette a disposizione per la gestione degli hash.

Inserimento di valori

Per creare un hash, è necessario inserirvi direttamente dei valori. Con la funzione HSET
creiamo una entry fornendo tre dati: chiave dell'hash, chiave della entry e valore della entry. Supponiamo di voler rappresentare una pagella scolastica, e che un hash sia la struttura che abbiamo scelto a tale scopo.
L'esempio è consono in quanto il nome di ogni materia può svolgere il ruolo di chiave per le entry, apparendo una sola volta:

> HSET pagella Italiano 8
(integer) 1
> HSET pagella Storia 7
(integer) 1
> HSET pagella Matematica 8
(integer) 1
> HSET pagella Geografia 7
(integer) 1
> HSET pagella Geografia 6
(integer) 0

Abbiamo inserito quattro entry. Ad ogni inserimento, abbiamo ricevuto in risposta il valore
1, che indica la creazione di una nuova chiave. Nell'ultimo caso, supponendo di aver fornito in prima
battuta un valore errato, abbiamo invocato nuovamente HSET con chiave Geografia. In quest'ultimo
caso abbiamo ricevuto uno 0 come risultato, il che indica l'avvenuto aggiornamento di una
chiave già esistente.

In alternativa ad HSET, si possono gestire gli inserimenti con HSETNX
che esegue l'inserimento solo se la chiave non esiste, non prevedendo la modalità di aggiornamento:
i risultati possibili sono 1 (successo) e 0 (fallimento, in quanto la mappa dispone già della stessa chiave).

Si può anche provvedere all'inserimento multiplo di valori con HMSET,
che sarà seguito da un elenco di chiavi e rispettivi valori alternati. Continuando l'esempio di prima:

> HMSET pagella Biologia 8 Chimica 9
OK

Sono state create così le entry (Biologia,8) e (Chimica,9) mentre rimarranno invariate quelle inserite in precedenza. HMSET permette
altresì l'aggiornamento di valori eventualmente preesistenti.

Lettura di valori

Per il recupero di un valore inserito, si può procedere con HGET
al quale saranno fornite la chiave che contraddistingue l'hash e quella che contraddistingue la entry:

> HGET pagella Biologia
"8"

Per la lettura multipla esistono due alternative: HGETALL, che
stampa sequenzialmente chiavi e valori alternandoli, e HMGET, che
richiede un elenco di chiavi delle quali restituisce i valori:

> HGETALL pagella
1) "Italiano"
2) "8"
3) "Storia"
4) "7"
5) "Matematica"
6) "8"
7) "Geografia"
8) "7"
9) "Biologia"
10) "8"
11) "Chimica"
12) "9"
> HMGET pagella Italiano Storia
1) "8"
2) "7"

Gestione di chiavi e valori

Per gestire correttamente gli insiemi di entry, chiavi e valori è necessario saper svolgere una
serie di operazioni che riportiamo qui di seguito in un elenco:

  • numero di entry: per sapere quante entry abbiamo inserito nell'hash, invochiamo la funzione HLEN:
    > HLEN pagella
    (integer) 6
  • verifica dell'esistenza di una chiave: ci si può accertare se una chiave è stata impostata
    utilizzando la funzione HEXISTS:
    > HEXISTS pagella Italiano
    (integer) 1
    > HEXISTS pagella italiano
    (integer) 0

    Il risultato sarà 1 in caso positivo (la chiave esiste) o 0 in caso negativo. Nell'esempio
    si evidenzia come le chiavi siano trattate in modalità case-sensitive;
  • elencare tutte le chiavi: per avere un elenco completo delle chiavi inserite nell'hash,
    si può ricorrere a HKEYS:
    > HKEYS pagella
    1) "Italiano"
    2) "Storia"
    3) "Matematica"
    4) "Geografia"
    5) "Biologia"
    6) "Chimica"
  • elencare tutti i valori: l'insieme dei valori possono essere recuperati con
    la funzione HVALS:
    > HVALS pagella
    1) "8"
    2) "7"
    3) "8"
    4) "7"
    5) "8"
    6) "9"
  • cancellare una entry: per rimuovere una voce dell'hash si può usare il
    comando HDEL:
    > HDEL pagella Biologia
    (integer) 1
    > HDEL pagella Astrofisica
    (integer) 0

    La chiave Biologia è stata correttamente individuata e cancellata, come certificato dal valore
    1 restituito. La materia Astrofisica, invece, non era presente nella pagella, e pertanto la risposta al
    comando è stata pari a 0.

Valori contatore

Se in un hash conserviamo valori numerici destinati ad essere regolarmente incrementati o decrementati,
possiamo gestirli con due specifiche funzioni: HINCRBY per soli numeri
interi e HINCRBYFLOAT anche per numeri in virgola mobile.
Per fare un esempio, immaginiamo di utilizzare un database Redis per conteggiare le visite che gli utenti
effettuano al nostro sito. Ogni entry corrisponderà ad un utente e la sua username ne costituirà la chiave:

> HINCRBY visite papero98 1
(integer) 1
> HINCRBY visite papero98 1
(integer) 2
> HINCRBY visite papero98 1
(integer) 3
> HINCRBY visite papero98 1
(integer) 4

Il numero intero restituito corrisponde al valore attuale legato alla chiave dopo
l'inserimento.

Hash come oggetti

Gli hash in Redis possono essere un ottimo modo per salvare in memoria oggetti nel senso
dato loro dalla Programmazione Orientata agli Oggetti: un'aggregazione di proprietà deputate
all'immagazzinamento di informazioni. Per salvare un oggetto in grado di rappresentare i dati di una
persona (nome, cognome, età, possesso di un'auto) potremmo ricorrere ad HMSET per la raccolta simultanea di tutti i
dati di nostro interesse o HSET per loro inserimenti singoli:

> HMGET persona1 nome Giulio cognome Rossi eta 25 automunito 1

Questo il contenuto dell'oggetto che abbiamo creato:

> HGETALL persona1
1) "nome"
2) "Giulio"
3) "cognome"
4) "Rossi"
5) "eta"
6) "25"
7) "automunito"
8) "1"

Man mano che si prende confidenza con le varie strutture dati di Redis e la loro integrazione reciproca, si apprezza meglio
l'utilità degli hash come rappresentazione di oggetti ed il contributo di questa tecnica alla realizzazione di database articolati.


Ti consigliamo anche