Il caso d'uso che descrivi non può essere modellato elegantemente nelle soluzioni NoSQL. Non è una limitazione Redis.
Lascia che lo spieghi un po' di più. Stai eseguendo query di intervallo su un campo e ordinando su un altro. Questo non è qualcosa in cui le soluzioni NoSQL sono brave. Ad esempio, Google App Engine vieta tali query. Dai un'occhiata alle restrizioni delle query GAE e leggi la sezione "Le proprietà nei filtri di disuguaglianza devono essere ordinate prima di altri ordini di ordinamento"
Per ottenere tutti i risultati che corrispondono a un filtro di disuguaglianza, una query esegue la scansione della tabella dell'indice per la prima riga corrispondente, quindi restituisce tutti i risultati consecutivi finché non trova una riga che non corrisponde. Affinché le righe consecutive rappresentino il set di risultati completo, le righe devono essere ordinate in base al filtro di disuguaglianza prima di altri ordinamenti.
Detto questo, puoi comunque eseguire le tue query in modo efficiente, ma la soluzione non sarà elegante.
- Crea fasce salariali:0-5000, 5000-10000, 10000-15000 e così via
- Crea set come
users_with_salary:10000-15000
. Questo set conterrà gli ID utente che hanno uno stipendio nell'intervallo specificato. - Allo stesso modo, crea set come `users_with_rating:1-2". Questo set conterrà ID utente che hanno valutazioni nell'intervallo specificato
- Ora, esegui il seguente pseudocodice
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;
}
}
}
Con redis 2.6 e lo scripting lua, puoi persino eseguirlo sul server lua.
In conclusione, se vuoi eseguire query complesse sui tuoi dati, è meglio modellarli in un database relazionale.