Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Portando do SQLite para o Redis


Acho que o melhor conselho é evitar aderir ao modelo relacional ao portar algo de um RDBMS para o Redis. E além do modelo, uma diferença importante é focar nos caminhos de acesso aos dados, bem como nas estruturas de dados.

O Redis não inclui uma linguagem de consulta (mas sim comanda a la memcached) e, portanto, não pode responder a consultas arbitrárias. Se um caminho de acesso aos dados não fizer parte da estrutura de dados, os dados não poderão ser recuperados com eficiência.

O Redis não é a melhor loja NoSQL quando se trata de oferecer suporte a consultas arbitrárias. Por exemplo, você seria melhor servido por algo como o MongoDB.

Agora, se você realmente deseja implementar suas coisas com o Redis, tente usar uma estratégia semelhante aos mecanismos de marcação. Seus registros podem ser armazenados em objetos de hash. Para cada parte da coluna das consultas arbitrárias às quais você precisa dar suporte, você cria índices reversos usando conjuntos.

Por exemplo:
# 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 união, interseção, diferença, consultas mais complexas podem ser implementadas. Para valores não discretos, ou para consultas baseadas em intervalo, devem ser usados ​​conjuntos ordenados (zset) (e podem ser combinados com conjuntos normais).

Esse método geralmente é bastante rápido se os valores forem suficientemente discriminantes. Observe que você não tem a flexibilidade de um RDBMS (sem expressões regulares, sem pesquisa prefixada, consultas de intervalo são difíceis de lidar, etc ...)