sql >> Databáze >  >> NoSQL >> Redis

Redis filtrovat podle rozsahu, seřadit a vrátit nejprve 10

Případ použití, který popisujete, nelze elegantně modelovat v řešeních NoSQL. Není to omezení Redis.

Dovolte mi to vysvětlit trochu více. V jednom poli spouštíte dotazy na rozsah a v jiném řadíte. To není něco, v čem jsou řešení NoSQL dobrá. Například Google App Engine takové dotazy zakazuje. Podívejte se na Omezení dotazů GAE a přečtěte si část "Vlastnosti ve filtrech nerovnosti musí být seřazeny před jinými příkazy řazení"

Chcete-li získat všechny výsledky, které odpovídají filtru nerovnosti, dotaz vyhledá první odpovídající řádek v tabulce indexu a poté vrátí všechny po sobě jdoucí výsledky, dokud nenajde řádek, který se neshoduje. Aby po sobě jdoucí řádky představovaly kompletní sadu výsledků, musí být řádky seřazeny podle filtru nerovnosti před jiným řazením.

Přesto můžete stále efektivně spouštět své dotazy, ale řešení nebude elegantní.

  1. Vytvořte platové rozpětí – 0–5 000, 5 000–10 000, 10 000–15 000 a tak dále
  2. Vytvářejte sady jako users_with_salary:10000-15000 . Tato sada bude obsahovat ID uživatelů, kteří mají plat v daném rozsahu.
  3. Podobně vytvořte sady jako `users_with_rating:1-2. Tato sada bude obsahovat ID uživatelů, kteří mají hodnocení v daném rozsahu
  4. Nyní spusťte následující pseudo kód

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

S redis 2.6 a lua skriptováním to můžete dokonce spustit na lua serveru.

Na závěr, pokud chcete na svá data spouštět složité dotazy, je nejlepší je modelovat v relační databázi.



  1. Vložený dokument vs reference v designovém modelu mongoose?

  2. Jak správně zvládnout migraci schématu mongoose?

  3. Převod HBase ACL na zásady Ranger

  4. Jak získat DIFF na seřazené sadě