O caso de uso que você descreve não pode ser modelado de forma elegante em soluções NoSQL. Não é uma limitação do Redis.
Deixe-me explicar isso um pouco mais. Você está executando consultas de intervalo em um campo e classificando em outro. Isso não é algo em que as soluções NoSQL sejam boas. Por exemplo, o Google App Engine proíbe essas consultas. Dê uma olhada nas Restrições de consulta do GAE e leia a seção "Propriedades em filtros de desigualdade devem ser classificadas antes de outras ordens de classificação"
Para obter todos os resultados que correspondem a um filtro de desigualdade, uma consulta verifica a tabela de índice em busca da primeira linha correspondente e retorna todos os resultados consecutivos até encontrar uma linha que não corresponda. Para que as linhas consecutivas representem o conjunto de resultados completo, as linhas devem ser ordenadas pelo filtro de desigualdade antes de outras ordens de classificação.
Dito isso, você ainda pode executar suas consultas com eficiência, mas a solução não será elegante.
- Criar faixas salariais - 0-5.000, 5.000-10.000, 10.000-15.000 e assim por diante
- Crie conjuntos como
users_with_salary:10000-15000
. Este conjunto conterá IDs de usuário que têm salário na faixa especificada. - Da mesma forma, crie conjuntos como "users_with_rating:1-2". Esse conjunto conterá IDs de usuários com classificações no intervalo especificado
- Agora, execute o seguinte pseudocódigo
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;
}
}
}
Com redis 2.6 e scripts lua, você pode até executar isso no servidor lua.
Concluindo, se você deseja executar consultas complexas em seus dados, é melhor modelá-los em um banco de dados relacional.