sql >> Database teknologi >  >> NoSQL >> Redis

Redis filtrer efter område, sorter og returner 10 først

Den use case, du beskriver, kan ikke modelleres elegant i NoSQL-løsninger. Det er ikke en Redis-begrænsning.

Lad mig forklare det lidt mere. Du kører områdeforespørgsler på ét felt og sorterer på et andet. Dette er ikke noget, NoSQL-løsninger er gode til. For eksempel forbyder Google App Engine sådanne forespørgsler. Tag et kig på GAE-forespørgselsrestriktioner og læs afsnittet "Egenskaber i ulighedsfiltre skal sorteres før andre sorteringsordrer"

For at få alle resultater, der matcher et ulighedsfilter, scanner en forespørgsel indekstabellen for den første matchende række og returnerer derefter alle på hinanden følgende resultater, indtil den finder en række, der ikke matcher. For at de på hinanden følgende rækker skal repræsentere det komplette resultatsæt, skal rækkerne sorteres efter ulighedsfilteret før andre sorteringsrækkefølger.

Når det er sagt, kan du stadig køre dine forespørgsler effektivt, men løsningen bliver ikke elegant.

  1. Opret lønintervaller - 0-5000, 5000-10000, 10000-15000 og så videre
  2. Opret sæt som users_with_salary:10000-15000 . Dette sæt vil indeholde bruger-id'er, der har løn i det givne interval.
  3. Opret på samme måde sæt som `brugere_med_vurdering:1-2". Dette sæt vil indeholde bruger-id'er, der har vurderinger inden for det givne område
  4. Kør nu følgende pseudokode

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

Med redis 2.6 og lua-scripting kan du endda køre dette på lua-serveren.

Afslutningsvis, hvis du vil køre komplekse forespørgsler på dine data, er det bedst at modellere dem i en relationsdatabase.



  1. Hvordan installeres MongoDb af Meteor?

  2. Laravel:Hvordan tjekker man Redis tilgængelighed?

  3. MongoDB Duplicate Documents, selv efter tilføjelse af unik nøgle

  4. Redis autofuldførelse