Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Potrzebujesz pomocy przy konceptualizacji w Redis/NoSQL

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).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kiedy używać magazynu klucza/wartości, takiego jak Redis, zamiast/obok bazy danych SQL?

  2. Wprowadzenie do struktur danych Redis:skróty

  3. Pod DigitalOcean ma niezwiązane natychmiastowe trwałe roszczenia dotyczące woluminów

  4. Pamięć kanału podrzędnego Redis Pub

  5. Jak zachować relacje has_many :through podczas serializacji do JSON iz powrotem w Rails 4.0.3?