sql >> Databasteknik >  >> NoSQL >> Redis

Behöver hjälp med att konceptualisera i Redis/NoSQL

Du har rätt i att endast enkla datastrukturer är tillgängliga med Redis, och de kan inte sammansättas av värde (som du skulle kunna göra med en dokumentorienterad databas som CouchDB eller MongoDB). Det är dock möjligt att komponera datastrukturer genom referens, och detta är ett mycket vanligt mönster.

Till exempel kan objekten i en uppsättning vara nycklar för andra objekt (listor, hashtabeller, andra uppsättningar, etc ...). Låt oss försöka tillämpa detta på ditt exempel.

För att modellera en relation mellan kunder och enhet+port kan du använda uppsättningar som innehåller kund-ID:n. För att lagra information om kunderna går det bra med en hashtabell per kund.

Här är kunderna:

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

Nycklarna till dessa poster är c:ID

Låt oss associera två av dem till en enhet och port:

sadd d:Los_Angeles:11 2 3

Nyckeln till denna uppsättning är d:device:port. Prefixen c:och d:är bara en konvention. En uppsättning per enhet/port bör skapas. En given kund kan tillhöra flera set (och därför associerad till flera enheter/portar).

Nu för att hitta kunder med leveransmetoder kopplade till den här enheten/porten behöver vi bara hämta innehållet i setet.

smembers d:Los_Angeles:11
1) "2"
2) "3"

sedan kan motsvarande kundinformation hämtas genom att pipelina ett antal hgetall-kommandon:

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"

Var inte rädd för antalet kommandon. De är mycket snabba och de flesta Redis-klienter har förmågan att pipeline förfrågningarna så att endast ett minimalt antal tur och retur behövs. Genom att bara använda en smedlem och flera hgetall kan problemet lösas med bara två tur och retur.

Nu är det möjligt att optimera lite ytterligare, tack vare det allestädes närvarande SORT-kommandot. Detta är förmodligen det mest komplexa kommandot i Redis, och det kan användas för att spara en tur och retur här.

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"

I ett kommando hämtar den innehållet i en enhet/portuppsättning och hämtar motsvarande kundinformation.

Det här exemplet var trivialt, men mer generellt, även om du kan representera komplexa datastrukturer med Redis, är det inte omedelbart. Du måste noga tänka på modellen både när det gäller struktur och dataåtkomst (dvs. vid designtillfället, håll dig till dina data OCH dina användningsfall).




  1. Dra och lägg till samtidigt med mongo

  2. Redis - övervakning av minnesanvändning

  3. Formatera ISODate från Mongodb

  4. Introduktion till Apache HBase Snapshots