Le cas d'utilisation que vous décrivez ne peut pas être modélisé avec élégance dans les solutions NoSQL. Ce n'est pas une limitation de Redis.
Permettez-moi d'expliquer cela un peu plus. Vous exécutez des requêtes de plage sur un champ et un tri sur un autre. Ce n'est pas quelque chose que les solutions NoSQL sont bonnes. Par exemple, Google App Engine interdit de telles requêtes. Jetez un œil aux restrictions de requête GAE et lisez la section "Les propriétés des filtres d'inégalité doivent être triées avant les autres ordres de tri"
Pour obtenir tous les résultats qui correspondent à un filtre d'inégalité, une requête parcourt la table d'index pour la première ligne correspondante, puis renvoie tous les résultats consécutifs jusqu'à ce qu'elle trouve une ligne qui ne correspond pas. Pour que les lignes consécutives représentent l'ensemble de résultats complet, les lignes doivent être triées par le filtre d'inégalité avant les autres ordres de tri.
Cela dit, vous pouvez toujours exécuter efficacement vos requêtes, mais la solution ne sera pas élégante.
- Créer des fourchettes de salaire – 0-5 000, 5 000-10 000, 10 000-15 000, etc.
- Créez des ensembles comme
users_with_salary:10000-15000
. Cet ensemble contiendra les identifiants d'utilisateurs dont le salaire se situe dans la plage donnée. - De même, créez des ensembles comme `users_with_rating :1-2". Cet ensemble contiendra les identifiants d'utilisateurs dont les notes se situent dans la plage donnée
- Maintenant, exécutez le pseudo-code suivant
String userids[];
for(rating = 10; rating > 0; rating--) {
for(salary = min_salary; salary < max_salary; salary += 5000) {
String salary_key = "users_with_salary:" + salary + "-" + (salary+5000);
String rating_key = "users_with_rating:" + rating + "-" + (rating+1);
userids.append(redis.sinter(salary_key, rating_key));
if(userids.length > 10) {
break;
}
}
}
Avec redis 2.6 et les scripts lua, vous pouvez même l'exécuter sur le serveur lua.
En conclusion, si vous souhaitez exécuter des requêtes complexes sur vos données, il est préférable de les modéliser dans une base de données relationnelle.