Máte pravdu, že s Redis jsou dostupné pouze jednoduché datové struktury a nelze je skládat podle hodnoty (jako byste to mohli udělat s databází orientovanou na dokumenty, jako je CouchDB nebo MongoDB). Je však možné skládat datové struktury pomocí odkazu, a to je velmi běžný vzor.
Položky obsažené v sadě mohou být například klíče pro jiné objekty (seznamy, hashovací tabulky, jiné sady atd...). Zkusme to aplikovat na váš příklad.
Chcete-li modelovat vztah mezi zákazníky a zařízením+portem, můžete použít sady obsahující ID zákazníků. Pro uložení informací o zákaznících stačí jedna hashovací tabulka na zákazníka.
Zde jsou zákazníci:
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
Klíče těchto záznamů jsou c:ID
Přidružme dva z nich k zařízení a portu:
sadd d:Los_Angeles:11 2 3
Klíčem této sady je d:device:port. Předpony c:a d:jsou pouze konvencí. Pro každé zařízení/port by měla být vytvořena jedna sada. Daný zákazník může patřit k několika sadám (a tedy přidružen k několika zařízením/portům).
Abychom nyní našli zákazníky se způsoby doručení připojenými k tomuto zařízení/portu, musíme pouze načíst obsah sady.
smembers d:Los_Angeles:11
1) "2"
2) "3"
pak lze získat odpovídající informace o zákaznících zřetězením řady příkazů 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"
Nebojte se množství příkazů. Jsou velmi rychlé a většina klientů Redis má schopnost zpracovat dotazy tak, že je potřeba pouze minimální počet zpátečních cest. Pouhým použitím jednoho smembers a několika hgetall lze problém vyřešit pouze dvěma zpátečními cestami.
Nyní je možné optimalizovat o něco dále díky všudypřítomnému příkazu SORT. Toto je pravděpodobně nejsložitější příkaz v Redis a lze jej použít k uložení zpáteční cesty.
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"
Jedním příkazem načte obsah sady zařízení/portů a načte odpovídající informace o zákazníkovi.
Tento příklad byl triviální, ale obecněji, i když pomocí Redis můžete reprezentovat složité datové struktury, není to okamžité. Model si musíte pečlivě promyslet jak z hlediska struktury, tak z hlediska přístupu k datům (tj. při návrhu se držte svých dat A vaše případy použití).