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

Porting da SQLite a Redis

Penso che il miglior consiglio sia quello di evitare di attenersi al modello relazionale durante il porting di qualcosa da un RDBMS a Redis. E al di là del modello, una differenza importante consiste nel concentrarsi sui percorsi di accesso ai dati e sulle strutture dei dati.

Redis non include un linguaggio di query (ma piuttosto comandi a la memcached) e quindi non può rispondere a query arbitrarie. Se un percorso di accesso ai dati non fa parte della struttura dei dati, i dati non possono essere recuperati in modo efficiente.

Redis non è il miglior negozio NoSQL quando si tratta di supportare query arbitrarie. Ad esempio, saresti meglio servito da qualcosa come MongoDB.

Ora, se vuoi davvero implementare le tue cose con Redis, puoi provare a utilizzare una strategia simile ai motori di tagging. I tuoi record possono essere archiviati in oggetti hash. Per ogni parte di colonna delle query arbitrarie che devi supportare, crei indici inversi usando gli insiemi.

Ad esempio:

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

Combinando unione, intersezione, differenza, possono essere implementate query più complesse. Per valori non discreti o per query basate su intervalli, è necessario utilizzare insiemi ordinati (zset) (e possono essere combinati con insiemi normali).

Questo metodo è generalmente abbastanza veloce se i valori sono sufficientemente discriminanti. Tieni presente che non hai la flessibilità di un RDBMS (nessuna espressione regolare, nessuna ricerca prefissata, query di intervallo sono una seccatura da gestire, ecc ...)