Opisany przypadek użycia nie może być elegancko modelowany w rozwiązaniach NoSQL. To nie jest ograniczenie Redis.
Pozwólcie, że wyjaśnię to nieco więcej. Wykonujesz zapytania o zakres w jednym polu i sortujesz w innym. Nie jest to coś, w czym rozwiązania NoSQL są dobre. Na przykład Google App Engine zabrania takich zapytań. Przyjrzyj się Ograniczeniom zapytań GAE i przeczytaj sekcję „Właściwości filtrów nierówności muszą być posortowane przed innymi porządkami sortowania”
Aby uzyskać wszystkie wyniki pasujące do filtra nierówności, zapytanie przeszukuje tabelę indeksów w poszukiwaniu pierwszego pasującego wiersza, a następnie zwraca wszystkie kolejne wyniki, aż znajdzie wiersz, który nie pasuje. Aby kolejne wiersze reprezentowały pełny zestaw wyników, wiersze muszą być uporządkowane według filtra nierówności przed innymi porządkami sortowania.
Powiedziawszy to, nadal możesz sprawnie uruchamiać zapytania, ale rozwiązanie nie będzie eleganckie.
- Utwórz zakresy wynagrodzeń - 0-5000, 5000-10000, 10000-15000 itd.
- Twórz zestawy takie jak
users_with_salary:10000-15000
. Ten zestaw będzie zawierał identyfikatory użytkowników, którzy mają pensję w podanym zakresie. - Podobnie utwórz zestawy, takie jak „users_with_rating:1-2”. Ten zestaw będzie zawierał identyfikatory użytkowników, którzy mają oceny w podanym zakresie
- Teraz uruchom następujący pseudokod
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;
}
}
}
Dzięki redis 2.6 i skryptom lua możesz to nawet uruchomić na serwerze lua.
Podsumowując, jeśli chcesz uruchamiać złożone zapytania na swoich danych, najlepiej zamodelować je w relacyjnej bazie danych.