Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis nach Bereich filtern, sortieren und 10 zuerst zurückgeben

Der von Ihnen beschriebene Anwendungsfall lässt sich in NoSQL-Lösungen nicht elegant modellieren. Es handelt sich nicht um eine Redis-Einschränkung.

Lassen Sie mich das etwas näher erläutern. Sie führen Bereichsabfragen für ein Feld aus und sortieren für ein anderes. Darin sind NoSQL-Lösungen nicht gut. Beispielsweise verbietet Google App Engine solche Abfragen. Werfen Sie einen Blick auf GAE-Abfrageeinschränkungen und lesen Sie den Abschnitt „Eigenschaften in Ungleichheitsfiltern müssen vor anderen Sortierreihenfolgen sortiert werden“

Um alle Ergebnisse zu erhalten, die mit einem Ungleichheitsfilter übereinstimmen, durchsucht eine Abfrage die Indextabelle nach der ersten übereinstimmenden Zeile und gibt dann alle aufeinanderfolgenden Ergebnisse zurück, bis sie eine Zeile findet, die nicht übereinstimmt. Damit die aufeinanderfolgenden Zeilen die vollständige Ergebnismenge darstellen, müssen die Zeilen durch den Ungleichheitsfilter vor anderen Sortierreihenfolgen sortiert werden.

Trotzdem können Sie Ihre Abfragen immer noch effizient ausführen, aber die Lösung wird nicht elegant sein.

  1. Erstellen Sie Gehaltsspannen – 0-5000, 5000-10000, 10000-15000 und so weiter
  2. Erstellen Sie Sätze wie users_with_salary:10000-15000 . Dieser Satz enthält Benutzer-IDs, deren Gehalt im angegebenen Bereich liegt.
  3. Erstellen Sie auf ähnliche Weise Sets wie "users_with_rating:1-2". Dieses Set enthält Benutzer-IDs mit Bewertungen im angegebenen Bereich
  4. Führen Sie nun den folgenden Pseudocode aus

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;
      }
   }
}

Mit Redis 2.6 und Lua-Scripting können Sie dies sogar auf dem Lua-Server ausführen.

Wenn Sie also komplexe Abfragen für Ihre Daten ausführen möchten, ist es am besten, sie in einer relationalen Datenbank zu modellieren.