2011-10-31 15 views
5

chciałbym przechowywać informacje w następujący sposób (uwaga, nie mam przywiązane do tej struktury danych w ogóle, ale to pokazuje bazowego informacje Chcę zapisać):Proste wyszukiwanie według wartości?

{ user_id: 12345, page_id: 2, country: 'DE' } 

W tych records, id_użytkownika jest unikalnym polem, ale id_strony nie jest.

Chciałbym przetłumaczyć to na strukturze danych Redis, i chciałbym być w stanie uruchomić wydajne wyszukiwanie następująco:

  • Dla user_id 12345, znajdź powiązany kraj.
  • Dla identyfikatora strony 2 znajdują wszystkie powiązane user_ids i ich kraje.

Czy rzeczywiście można to zrobić w Redis? Jeśli tak, to jakich struktur danych należy używać i jak należy unikać możliwości duplikowania rekordów po ich wstawieniu?

Odpowiedz

4

Wygląda na to, że potrzebujesz dwóch kluczowych typów: klawisz HASH do przechowywania danych użytkownika i LISTY dla każdej strony zawierającej listę powiązanych użytkowników. Poniżej znajduje się przykład tego, jak to może działać.

ładowania danych:

> RPUSH page:2:users 12345 
> HMSET user:12345 country DE key2 value2 

ściągania danych:

# All users for page 2 
> LRANGE page:2:users 0 -1 

# All users for page 2 and their countries 
> SORT page:2:users By nosort GET # GET user:*->country GET user:*->key2 

usunąć użytkownika z Page:

> LREM page:2:users 0 12345 

Powtórz GET w tym rodzaju, aby pobrać dodatkowe wartości dla użytkownika.

Mam nadzieję, że to pomoże, daj mi znać, jeśli jest coś, co chciałbyś wyjaśnić lub potrzebujesz dalszej pomocy. Polecam również przeczytanie listy poleceń i dokumentacji dostępnej pod adresem redis web site, w szczególności dotyczącej operacji SORT.

+0

Dzięki - faktycznie skończyłem używać HASH i SET, zamiast LISTA - ale dobra odpowiedź! – Richard

1

Ponieważ id_użytkownika jest unikalny, podobnie jak kraj, zachowaj je w prostej parze klucz-wartość. Zapytanie dla użytkownika to O (1) w takim przypadku ... Następnie zachowaj niektóre Redis sets, z kluczem id_strony i członkami wszystkie identyfikatory_użytkowników ..

+0

Dzięki. Obawiam się o to: co jeśli wstawisz nowego użytkownika do pary klucz-wartość, a następnie * przed * możesz dodać wpis zestawu, baza danych zostanie wyłączona? Kiedy pojawi się ponownie, pozostaniesz z nieprzyjemnymi, częściowo wprowadzonymi bitami informacji. – Richard

+1

W takim przypadku masz dwie opcje: albo zachowaj jakiś stan w swoim kodzie klienta, innymi słowy, sprawdź wynik, który powoduje powrót po każdej operacji i zachowuj się odpowiednio w przypadku niepowodzenia, albo użyj http: // redis. transakcje io/commands #; – hymloth

+1

Myślę, że [Pipelining] (http://redis.io/topics/pipelining) jest dobrym wyborem –

Powiązane problemy