Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Redis filtra por intervalo, classifica e retorna 10 primeiro


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.
  1. Criar faixas salariais - 0-5.000, 5.000-10.000, 10.000-15.000 e assim por diante
  2. Crie conjuntos como users_with_salary:10000-15000 . Este conjunto conterá IDs de usuário que têm salário na faixa especificada.
  3. Da mesma forma, crie conjuntos como "users_with_rating:1-2". Esse conjunto conterá IDs de usuários com classificações no intervalo especificado
  4. 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.