È corretto che solo le strutture di dati semplici sono disponibili con Redis e non possono essere composte in base al valore (come si potrebbe fare con un database orientato ai documenti come CouchDB o MongoDB). Tuttavia, è possibile comporre strutture di dati per riferimento, e questo è uno schema molto comune.
Ad esempio, gli elementi contenuti in un set possono essere le chiavi per altri oggetti (elenchi, tabelle hash, altri set, ecc.). Proviamo ad applicare questo al tuo esempio.
Per modellare una relazione tra clienti e dispositivo + porta, è possibile utilizzare set contenenti ID cliente. Per memorizzare le informazioni sui clienti, una tabella hash per cliente va bene.
Qui ci sono i clienti:
hmset c:1 name Smith protocol tcp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:2 name Jackson protocol udp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:3 name Davis protocol tcp snmp_dest 127.0.0.3 syslog_dest 127.0.0.4
Le chiavi di questi documenti sono c: ID
Let associato due di loro di un dispositivo e la porta:
sadd d:Los_Angeles:11 2 3
La chiave di questo set è d: device: port. Il c: e d: i prefissi sono solo una convenzione. Dovrebbe essere creato un set per dispositivo/porta. Un determinato cliente potrebbe appartenere a più set (e quindi associato a più dispositivi/porte).
Ora per trovare i clienti con metodi di consegna collegati a questo dispositivo/porta, dobbiamo solo recuperare il contenuto del set.
smembers d:Los_Angeles:11
1) "2"
2) "3"
quindi le informazioni sul cliente corrispondente può essere recuperato da pipelining una serie di comandi hgetall:
hgetall c:2
hgetall c:3
1) "name"
2) "Jackson"
3) "protocol"
4) "udp"
5) "snmp_dest"
6) "127.0.0.1"
7) "syslog_dest"
8) "127.0.0.2"
1) "name"
2) "Davis"
3) "protocol"
4) "tcp"
5) "snmp_dest"
6) "127.0.0.3"
7) "syslog_dest"
8) "127.0.0.4"
Non temere il numero di comandi. Sono molto veloci e la maggior parte dei client Redis è in grado di eseguire la pipeline delle query in modo che sia necessario un numero minimo di roundtrip. Usando solo uno smembratore e diversi hgetall, il problema può essere risolto con solo due roundtrip.
Ora, è possibile ottimizzare ulteriormente, grazie al comando SORT onnipresente. Questo è probabilmente il comando più complesso in Redis e può essere utilizzato per salvare un roundtrip qui.
sort d:Los_Angeles:11 by nosort get c:*->name get c:*->protocol get c:*->snmp_dest get c:*->syslog_dest
1) "Jackson"
2) "udp"
3) "127.0.0.1"
4) "127.0.0.2"
5) "Davis"
6) "tcp"
7) "127.0.0.3"
8) "127.0.0.4"
In un comando, si recupera il contenuto di un set di dispositivi/porto e recupera le informazioni sul cliente corrispondente.
Questo esempio è stato banale, ma più in generale, mentre è possibile rappresentare strutture dati complesse con Redis, non è immediato. È necessario riflettere attentamente sul modello sia in termini di struttura che di accesso ai dati (ad esempio in fase di progettazione, attenersi ai dati E i casi d'uso).
Hai dato un'occhiata al Redis Hash? hmset/hmget, ad esempio, ti consente di associare una singola chiave e più "campi" che potrebbero rappresentare le tue identità. http://openmymind.net/2012/1/23/The-Little-Redis-Book/ - il libro Redis ha alcuni buoni esempi. – Alex
In realtà NON ho visto HMSET/HMGET. Deve essere una nuova aggiunta dopo il tutorial che ho seguito. Giocherò con quello. –