sql >> Base de Datos >  >> NoSQL >> Redis

Redis filtra por rango, ordena y devuelve 10 primero

El caso de uso que describe no se puede modelar elegantemente en soluciones NoSQL. No es una limitación de Redis.

Déjame explicarte eso un poco más. Está ejecutando consultas de rango en un campo y ordenando en otro. Esto no es algo en lo que las soluciones NoSQL sean buenas. Por ejemplo, Google App Engine prohíbe tales consultas. Eche un vistazo a las restricciones de consulta de GAE y lea la sección "Las propiedades en los filtros de desigualdad deben ordenarse antes que otros órdenes de clasificación"

Para obtener todos los resultados que coincidan con un filtro de desigualdad, una consulta escanea la tabla de índice en busca de la primera fila que coincida y luego devuelve todos los resultados consecutivos hasta que encuentra una fila que no coincide. Para que las filas consecutivas representen el conjunto de resultados completo, las filas deben estar ordenadas por el filtro de desigualdad antes que otros órdenes de clasificación.

Habiendo dicho eso, aún puede ejecutar sus consultas de manera eficiente, pero la solución no será elegante.

  1. Cree rangos de salario:0-5000, 5000-10000, 10000-15000, etc.
  2. Cree conjuntos como users_with_salary:10000-15000 . Este conjunto contendrá identificaciones de usuario que tienen un salario en el rango dado.
  3. Del mismo modo, cree conjuntos como `users_with_rating:1-2". Este conjunto contendrá ID de usuario que tengan calificaciones en el rango dado
  4. Ahora, ejecute el siguiente 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;
      }
   }
}

Con redis 2.6 y secuencias de comandos lua, incluso puede ejecutar esto en el servidor lua.

En conclusión, si desea ejecutar consultas complejas sobre sus datos, lo mejor es modelarlo en una base de datos relacional.