2012-01-10 3 views
4

J'utilise redis avec plusieurs bases de données (que je commute par la commande SELECT).Redis SELECT performance

Je stocke différents types d'informations dans redis et j'avais besoin de le séparer en quelque sorte. Je n'aimais pas préfixer les clés pour distniguar le type d'information donc j'ai créé plus de bases de données.

Je voudrais demander si c'était une bonne décision, avec un souci de performance?

De même, combien de temps sépare SELECT? Si j'ai besoin de traverser certaines données liées à partir de deux bases de données, quelle approche est meilleure (voir pseudo code)?

for data in array { 
    redis_select(0) 
    k = redis_get(...) 
    redis_select(1) 
    k2 = redis_get(k) 
} 

ou

redis_select(0) 
k = [] 
for data in array { 
    k[x] = redis_get(...) 
} 

redis_select(1) 
k2 = [] 
for data in array { 
    k2[x] = redis_get(k[x]) 
} 

Répondre

7

Vous pouvez utiliser le concept de base de données Redis à des données séparées. Ceci est entièrement pris en charge dans la version actuelle, et sera toujours pris en charge dans les versions futures.

Maintenant, ce n'est pas la solution recommandée pour isoler des données. Il est préférable d'exécuter plusieurs instances Redis à la place. Le temps système d'une instance est très faible (moins de 1 Mo), vous pouvez donc en lancer plusieurs sur n'importe quelle case. Il est plus évolutif (la charge de travail sera répartie sur plusieurs cœurs de processeurs au lieu d'un seul). Il est plus flexible (vous pouvez utiliser différents paramètres de configuration par ensemble de données ou différents fichiers de vidage). Votre client doit simplement ouvrir une connexion par instance pour accéder aux différents ensembles de données. Maintenant, si vous voulez toujours utiliser les bases de données Redis et que vous êtes préoccupé par les performances, vous devez évaluer le nombre d'allers-retours supplémentaires qu'elles représentent. Avec des bases de données en mémoire telles que Redis, le coût de toutes les opérations de base est presque le même, car il est dominé par la gestion des communications et des protocoles, et non par l'exécution elle-même. Ainsi, lorsque les clés/valeurs sont petites, les commandes GET, SET, SELECT tendent à avoir le même coût. Chaque fois qu'un SELECT est exécuté, c'est comme si une commande GET ou SET supplémentaire était exécutée. En prenant vos exemples, la première proposition va générer 4 commandes par élément de la matrice. La deuxième proposition générera seulement 2 commandes par item, donc c'est beaucoup plus efficace. Si le nombre d'articles est significatif, le coût de SELECT est négligeable dans la deuxième proposition, alors qu'il ne l'est pas dans le premier. Si vous envisagez d'itérer sur des tableaux pour exécuter des commandes Redis, pensez à utiliser des commandes de paramètres variadiques (telles que MGET/MSET) ou pipelining (si votre client le supporte), afin de réduire le nombre général de roundtrips.

Questions connexes