sql >> Database teknologi >  >> NoSQL >> Redis

Portering fra SQLite til Redis

Jeg synes, det bedste råd er at undgå at holde sig til den relationelle model, når man porterer noget fra en RDBMS til Redis. Og ud over modellen er en vigtig forskel at fokusere på dataadgangsstier såvel som datastrukturerne.

Redis inkluderer ikke et forespørgselssprog (men kommandoer derimod a la memcached), og kan derfor ikke svare på vilkårlige forespørgsler. Hvis en adgangssti til dataene ikke er en del af datastrukturen, kan dataene ikke hentes effektivt.

Redis er ikke den bedste NoSQL-butik, når det kommer til at understøtte vilkårlige forespørgsler. For eksempel ville du være bedre tjent med noget som MongoDB.

Hvis du virkelig vil implementere dine ting med Redis, kan du prøve at bruge en strategi, der ligner tagging-motorer. Dine poster kan gemmes i hash-objekter. For hver kolonnedel af de vilkårlige forespørgsler, du skal understøtte, bygger du omvendte indekser ved hjælp af sæt.

For eksempel:

# Set up the records: one hash object per record
hmset user:1 name Bilbo type Hobbit job None
hmset user:2 name Frodo type Hobbit job None
hmset user:3 name Gandalf type Maiar job Wizard
hmset user:4 name Aragorn type Human job King
hmset user:5 name Boromir type Human job Warrior

# Set up the indexes: one set per value per field
sadd name:Bilbo 1
sadd name:Frodo 2
sadd name:Gandalf 3
sadd name:Aragorn 4
sadd name:Boromir 5
sadd type:Hobbit 1 2
sadd type:Maiar 3
sadd type:Human 4 5
sadd job:None 1 2
sadd job:Wizard 3
sadd job:King 4
sadd job:Warrior 5

# Perform a query: we want the humans who happen to be a king
# We just have to calculate the intersection of the corresponding sets
sinterstore tmp type:Human job:King
sort tmp by nosort get user:*->name get user:*->job get user:*->type
1) "Aragorn"
2) "King"
3) "Human"

Ved at kombinere union, kryds, forskel, kan mere komplekse forespørgsler implementeres. For ikke-diskrete værdier eller for intervalbaserede forespørgsler skal ordnede sæt (zset) bruges (og kan kombineres med normale sæt).

Denne metode er normalt ret hurtig, hvis værdierne er diskriminerende nok. Bemærk dog, at du ikke har fleksibiliteten som et RDBMS (ingen regulære udtryk, ingen præfikssøgning, rækkeviddeforespørgsler er besværlige at håndtere, osv...)




  1. Hvorfor anbefales det ikke at lukke en MongoDB-forbindelse nogen steder i Node.js-koden?

  2. Samme opgave udført flere gange

  3. Fjernelse af specifikke elementer fra array med MongoDB

  4. MongoDB $substrCP