De use case die u beschrijft, kan niet elegant worden gemodelleerd in NoSQL-oplossingen. Het is geen Redis-beperking.
Laat me dat wat meer uitleggen. U voert bereikquery's uit op het ene veld en sorteert op een ander. Dit is niet iets waar NoSQL-oplossingen goed in zijn. Google App Engine verbiedt bijvoorbeeld dergelijke zoekopdrachten. Bekijk GAE-querybeperkingen en lees de sectie "Eigenschappen in ongelijkheidsfilters moeten worden gesorteerd voor andere sorteervolgorden"
Om alle resultaten te krijgen die overeenkomen met een ongelijkheidsfilter, scant een query de indextabel voor de eerste overeenkomende rij en retourneert vervolgens alle opeenvolgende resultaten totdat een rij wordt gevonden die niet overeenkomt. Om ervoor te zorgen dat de opeenvolgende rijen de volledige resultatenset vertegenwoordigen, moeten de rijen worden geordend door het ongelijkheidsfilter vóór andere sorteervolgordes.
Dat gezegd hebbende, kunt u uw zoekopdrachten nog steeds efficiënt uitvoeren, maar de oplossing zal niet elegant zijn.
- Salarisbereiken maken - 0-5000, 5000-10000, 10000-15000 enzovoort
- Maak sets zoals
users_with_salary:10000-15000
. Deze set bevat gebruikers-ID's met een salaris in het opgegeven bereik. - Maak op dezelfde manier sets als `users_with_rating:1-2'. Deze set bevat gebruikers-ID's met beoordelingen in het opgegeven bereik
- Voer nu de volgende pseudo-code uit
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;
}
}
}
Met redis 2.6 en lua-scripting kun je dit zelfs op de lua-server uitvoeren.
Kortom, als u complexe query's op uw gegevens wilt uitvoeren, kunt u deze het beste in een relationele database modelleren.