sql >> Database >  >> NoSQL >> Redis

Overzetten van SQLite naar Redis

Ik denk dat het beste advies is om niet vast te houden aan het relationele model bij het overzetten van iets van een RDBMS naar Redis. En naast het model is een belangrijk verschil de focus op zowel de datatoegangspaden als de datastructuren.

Redis bevat geen zoektaal (maar commando's a la memcached), en kan daarom geen willekeurige vragen beantwoorden. Als een toegangspad tot de gegevens geen deel uitmaakt van de gegevensstructuur, kunnen de gegevens niet efficiënt worden opgehaald.

Redis is niet de beste NoSQL-winkel als het gaat om het ondersteunen van willekeurige zoekopdrachten. U zou bijvoorbeeld beter bediend kunnen worden door iets als MongoDB.

Als je nu echt je spullen met Redis wilt implementeren, kun je proberen een strategie te gebruiken die vergelijkbaar is met het taggen van engines. Uw records kunnen worden opgeslagen in hash-objecten. Voor elk kolomgedeelte van de willekeurige zoekopdrachten die u moet ondersteunen, bouwt u omgekeerde indexen met behulp van sets.

Bijvoorbeeld:

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

Door unie, intersectie, verschil te combineren, kunnen complexere queries worden geïmplementeerd. Voor niet-discrete waarden of voor op bereik gebaseerde zoekopdrachten moeten geordende sets (zset) worden gebruikt (en kunnen worden gecombineerd met normale sets).

Deze methode is meestal vrij snel als de waarden discriminerend genoeg zijn. Houd er echter rekening mee dat u niet over de flexibiliteit van een RDBMS beschikt (geen reguliere expressies, geen zoeken met voorvoegsels, bereikquery's zijn lastig om mee om te gaan, enz ...)




  1. Opvallende kenmerken van MapReduce - Belang van MapReduce

  2. MongoDB $arrayElemAt

  3. Redis - enige manier om een ​​gebeurtenis te activeren wanneer er niet langer actief naar een waarde wordt geschreven?

  4. TTL voor een vast lid