2012-01-10 13 views
49

Powiedzmy, że mam skrót mieszania np.Złożone struktury danych Redis

$data = { 
    'harry' : { 
     'age' : 25, 
     'weight' : 75, 
    }, 
    'sally' : { 
     'age' : 25, 
     'weight' : 75, 
    } 
} 
  1. Co to robił „zwykły” sposób na przechowywanie takiej struktury danych
  2. Czy można bezpośrednio uzyskać wartość (np dostać Harry:
  3. wiek (lub nie masz?)?
  4. Po zapisaniu można bezpośrednio zmienić wartość klucza sub (np Sally: waga = 100)
+1

Również w jaki sposób możemy posortować dane w Redis ?. Tak jak ja chcę dostać 10 najlepszych nazw, które mają największą wagę. – Bharat

Odpowiedz

20

Co to robił „zwykły” sposób na przechowywanie takiej struktury danych (lub będzie nie?)

Na przykład harry i sally będą przechowywane w osobnych hashes, gdzie pola będą reprezentować ich właściwości, takie jak wiek i waga. Wtedy struktura będzie zawierała wszystkie elementy (harry, sally, ...), które zapisałeś w redis.

Czy można bezpośrednio uzyskać wartość (np dostać Harry: wiek)

Tak, patrz HGET lub HMGET lub HGETALL.

Po zapisaniu można bezpośrednio zmienić wartość klucza sub (np Sally: waga = 100)

Tak, patrz HSET.

+1

Dzięki - więc musiałby być przechowywany w wielu operacjach? na przykład Nie mogłem zapisać struktury danych za jednym razem? Oczywiście był to po prostu trywialny przykład, który chciałby przechowywać bardziej złożone "obiekty" i może nie rozumiem, czy to jest właściwa droga? – Xrender

+0

Cała redis jest oparta na prostych operacjach wśród jej zaawansowanych struktur danych. Możesz spróbować spojrzeć na [ohm] (http://ohm.keyvalue.org/), które może dla ciebie wyodrębnić pewne rzeczy. – yojimbo87

+0

Możesz również napisać własne skrypty w [Lua] (http://redis.io/commands/eval); aplikacja może wysłać skrypt Lua tak, jakby była kwerendą EVAL i będzie wykonywana na serwerze Redis, pozwalając skryptowi Lua uruchamiać wiele poleceń Redis bez wielokrotnych przejazdów w obie strony przez sieć. – ekillaby

15

Weźmy złożoną dane, które musimy przechowywać w REDiS, na przykład ten:

$data = { 
      "user:1" : { 
         name : "sally", 
         password : "123" 
         logs : "25th october" "30th october" "12 sept", 
         friends : "34" , "24", "10" 
        } 
      "user:2" :{ 
         name : "" 
         password : "4567" 
         logs : 
         friends: "" 
        } 
      } 

problem, że mamy do czynienia jest to, że przyjaciele & dzienniki są wykazy. Więc co możemy zrobić, aby reprezentować te dane w REDiS to użyć mieszań i wykazy coś takiego:

Opcja 1.Mapa hash z kluczami jako użytkownik: 1 i użytkownik: 2

 hmset user:1 name "sally" password "12344" 
     hmset user:2 name "pally" password "232342" 
     create separate list of logs as 
       logs:1 { here 1 is the user id } 
       lpush logs:1 "" "" "" 
       lpush logs:2 "" "" "" 
     and similarly for friends. 

Opcja 2: Mapa hash z dumpingowym danych JSON jako ciąg kodowania

 hmset user:1 name "sally" password "12344" logs "String_dumped_data" friends "string of dumped data" 

Opcja 3: Jest to kolejny reprezentacja # 1

 something like user:1:friends -> as a list 
     and   user:2:friends -> as a list 

Proszę, popraw mnie, jeśli jestem zły.

+0

Tak jak Starter w Redis, to są rozwiązania, o których mógłbym pomyśleć. Ale rozważanie jest o krok dalej. Powiedzmy, że musisz pobrać wszystkie dzienniki wszystkich użytkowników, którzy mają "24" jako "Przyjaciela". W przypadku 1 należy przeczytać wszystkie listy znajomych i zebrać identyfikatory użytkowników, a następnie uzyskać wszystkie dzienniki. (= Obowiązkowe podróże w obie strony) W przypadku 2 nie mam pojęcia, czy redis ma możliwość wysyłania zapytań do wewnętrznych danych json. I jaki będzie występ. Aby dodać trzeci przypadek, powiedz "Przyjaciele" był bardziej stały typ danych, takich jak "Prawa" Czy taka konstrukcja ma sens? user: 21: friends: 23-43-12 -> as List –

+0

W tym przypadku możemy użyć polecenia EVAL do wewnętrznego przetwarzania lua –

Powiązane problemy