Masz rację, że w Redis dostępne są tylko proste struktury danych i nie można ich składać z wartości (tak jak w przypadku bazy danych zorientowanej na dokumenty, takiej jak CouchDB lub MongoDB). Jednak możliwe jest komponowanie struktur danych przez odniesienie i jest to bardzo powszechny wzorzec.
Na przykład elementy zawarte w zestawie mogą być kluczami do innych obiektów (listy, tablice mieszające, inne zestawy itp.). Spróbujmy zastosować to do twojego przykładu.
Do modelowania relacji między klientami a urządzeniem+port można użyć zestawów zawierających identyfikatory klientów. Aby przechowywać informacje o klientach, wystarczy jedna tablica mieszająca na klienta.
Oto klienci:
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
Klucze tych rekordów to c:ID
Powiążmy dwa z nich z urządzeniem i portem:
sadd d:Los_Angeles:11 2 3
Kluczem tego zestawu jest d:device:port. Prefiksy c:i d:to tylko konwencja. Należy utworzyć jeden zestaw na urządzenie/port. Dany klient może należeć do kilku zestawów (a zatem powiązany z kilkoma urządzeniami/portami).
Teraz, aby znaleźć klientów z metodami dostawy podłączonymi do tego urządzenia/portu, wystarczy pobrać zawartość zestawu.
smembers d:Los_Angeles:11
1) "2"
2) "3"
następnie odpowiednie informacje o kliencie można pobrać za pomocą kilku poleceń 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"
Nie bój się ilości poleceń. Są bardzo szybkie, a większość klientów Redis ma możliwość potokowania zapytań, dzięki czemu wymagana jest tylko minimalna liczba rund. Używając tylko jednego członka i kilku hgetall, problem można rozwiązać za pomocą zaledwie dwóch podróży w obie strony.
Teraz możliwa jest nieco dalsza optymalizacja, dzięki wszechobecnemu poleceniu SORT. Jest to prawdopodobnie najbardziej złożone polecenie w Redis i może być użyte do zapisania tutaj podróży w obie strony.
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"
W jednym poleceniu pobiera zawartość zestawu urządzeń/portów i pobiera odpowiednie informacje o kliencie.
Ten przykład był trywialny, ale ogólniej, chociaż możesz reprezentować złożone struktury danych za pomocą Redis, nie jest to natychmiastowe. Musisz dokładnie przemyśleć model zarówno pod kątem struktury, jak i dostępu do danych (tj. w czasie projektowania trzymaj się swoich danych ORAZ Twoje przypadki użycia).