Redis
 sql >> Base de données >  >> NoSQL >> Redis

Portage de SQLite vers Redis

Je pense que le meilleur conseil est d'éviter de s'en tenir au modèle relationnel lors du portage de quelque chose d'un SGBDR vers Redis. Et au-delà du modèle, une différence importante est de se concentrer sur les chemins d'accès aux données ainsi que sur les structures de données.

Redis n'inclut pas de langage de requête (mais plutôt des commandes à la memcached), et ne peut donc pas répondre à des requêtes arbitraires. Si un chemin d'accès aux données ne fait pas partie de la structure de données, les données ne peuvent pas être récupérées efficacement.

Redis n'est pas le meilleur magasin NoSQL lorsqu'il s'agit de prendre en charge des requêtes arbitraires. Par exemple, vous seriez mieux servi par quelque chose comme MongoDB.

Maintenant, si vous voulez vraiment implémenter vos trucs avec Redis, vous pouvez essayer d'utiliser une stratégie similaire aux moteurs de balisage. Vos enregistrements peuvent être stockés dans des objets de hachage. Pour chaque partie de colonne des requêtes arbitraires que vous devez prendre en charge, vous créez des index inversés à l'aide d'ensembles.

Par exemple :

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

En combinant union, intersection, différence, des requêtes plus complexes peuvent être mises en œuvre. Pour les valeurs non discrètes ou pour les requêtes basées sur des plages, des ensembles ordonnés (zset) doivent être utilisés (et peuvent être combinés avec des ensembles normaux).

Cette méthode est généralement assez rapide si les valeurs sont suffisamment discriminantes. Veuillez noter que vous n'avez pas la flexibilité d'un SGBDR (pas d'expressions régulières, pas de recherche préfixée, les requêtes de plage sont pénibles à gérer, etc ...)