sql >> Databasteknik >  >> NoSQL >> Redis

Portering från SQLite till Redis

Jag tror att det bästa rådet är att undvika att hålla sig till relationsmodellen när man porterar något från en RDBMS till Redis. Och bortom modellen är en viktig skillnad att fokusera på dataåtkomstvägar såväl som datastrukturer.

Redis inkluderar inte ett frågespråk (utan kommandon a la memcached), och kan därför inte svara på godtyckliga frågor. Om en åtkomstväg till data inte är en del av datastrukturen kan data inte hämtas effektivt.

Redis är inte den bästa NoSQL-butiken när det gäller att stödja godtyckliga frågor. Till exempel skulle du vara bättre betjänt av något som MongoDB.

Nu, om du verkligen vill implementera dina saker med Redis, kan du försöka använda en strategi som liknar taggningsmotorer. Dina poster kan lagras i hashobjekt. För varje kolumndel av de godtyckliga frågorna du behöver stödja bygger du omvända index med uppsättningar.

Till exempel:

# 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"

Genom att kombinera union, skärningspunkt, skillnad, kan mer komplexa frågor implementeras. För icke-diskreta värden, eller för intervallbaserade frågor, måste ordnade uppsättningar (zset) användas (och kan kombineras med normala uppsättningar).

Denna metod är vanligtvis ganska snabb om värdena är tillräckligt diskriminerande. Observera att du dock inte har flexibiliteten hos ett RDBMS (inga reguljära uttryck, inga prefixerade sökningar, intervallfrågor är jobbiga att hantera, etc ...)




  1. Hur får man alla väntande jobb i laravel-kön på redis?

  2. MongoDB frågar prestanda för över 5 miljoner poster

  3. Mongoose underdokument vs kapslade schema

  4. Mongo-aggregation Matcha flera värden