Redis jest przeznaczony do przypadków użycia, w których trzeba uzyskiwać dostęp do danych i aktualizować je z bardzo dużą częstotliwością oraz w przypadku korzystania ze struktur danych (haszów, zestawów, list, ciągów lub posortowanych zestawów). Został stworzony, aby wypełnić bardzo specyficzne przypadki użycia. Jeśli masz ogólny przypadek użycia, taki jak bardzo elastyczne wyszukiwanie, znacznie lepiej byłoby obsługiwane przez coś stworzonego do tego celu, takiego jak elastyczne wyszukiwanie lub SOLR.
To powiedziawszy, jeśli musisz to zrobić w Redis, oto jak to zrobię (zakładając, że użytkownicy mogą udostępniać nazwiska i numery telefonów):
name:some_name -> set([id1, id2, etc...])
name:some_other_name -> set([id3, id4, etc...])
phone:some_phone -> set([id1, id3, etc...])
phone:some_other_phone -> set([id2, id4, etc...])
id1 -> {'name' : 'bob', 'phone' : '123-456-7891', etc...}
id2 -> {'name' : 'alice', 'phone' : '987-456-7891', etc...}
W tym przypadku tworzymy nowy klucz dla każdej nazwy (z prefiksem „name:”) i każdego numeru telefonu (z prefiksem „phone:”). Każdy klucz wskazuje na zestaw identyfikatorów, które zawierają wszystkie informacje, które chcesz dla użytkownika. Na przykład podczas wyszukiwania telefonu:
HGETALL 'phone:123-456-7891'
a następnie przejdź przez wyniki w pętli i zwróć wszelkie informacje o każdym z nich (nazwa w naszym przykładzie) w wybranym języku (możesz zrobić to wszystko w Lua po stronie serwera na polu Redis, aby przejść jeszcze szybciej i uniknąć ponownego połączenia z siecią dalej, jeśli chcesz):
for id in results:
HGET id 'name'
Twój koszt tutaj wyniesie O(m)
gdzie m
to liczba użytkowników z podanym numerem telefonu, a będzie to bardzo szybka operacja na Redis ze względu na to, jak jest zoptymalizowana pod kątem szybkości. W twoim przypadku będzie to przesada, ponieważ prawdopodobnie nie potrzebujesz, aby wszystko działo się tak szybko i wolisz mieć elastyczne wyszukiwanie, ale tak właśnie byś to zrobił.