2015-01-22 6 views
5

Pobieram użytkownika (z powiązaniem profilu itp.) Z bazy danych przy prawie każdym żądaniu. Chciałbym buforować na serwerze i zapisać w bazie danych trochę dodatkowej pracy. Początkowo myśli Redis lub Memcached, a ostatecznie rozproszone pamięci podręcznej wspierane przez Mnesię.Jak serializować/deserializować model Ecto ze skojarzeniami ładowanymi?

Wiem, jak wykonać transport (pliku binarnego w przypadku Redis/Memcache do pamięci podręcznej buforowania), ale w jaki sposób mogę serializować i deserializować model do pliku binarnego?

Odpowiedz

11

Możesz spróbować użyć funkcji i :erlang.binary_to_term/1 (małe fragmenty dokumentacji here).

Mały przykład:

iex> defmodule FooStruct do 
...> defstruct foofield: nil 
...> end 
iex> struct = %FooStruct{foofield: 42} 
iex> binary_representation = :erlang.term_to_binary(struct) 
<<131, 116, 0, 0, 0, 2, 100, 0 ... >> 
iex> :erlang.binary_to_term(binary_representation) 
%FooStruct{foofield: 42} 

Powinien działać z prawie wszystkiego (myślę!).

W szczególności w Redis, możesz wysyłać bezpośrednio surowe dane binarne do serwera Redis i konwertować je z powrotem do struktur danych Elixir po ich odzyskaniu z serwera (ponownie jako dane binarne). Oto mały przykład (przy użyciu exredis):

iex> client = Exredis.start 
iex> data = :erlang.term_to_binary(%{foo: "bar"}) 
<<...>> 
iex> client |> Exredis.query(["SET", "mymap", data]) 
"OK" 
iex> retrieved_data = client |> Exredis.query(["GET", "mymap"]) 
<<...>> 
iex> :erlang.binary_to_term(retrieved_data) 
%{foo: "bar"} 
+0

Myślisz kodowanie base64 jest najlepszym sposobem, aby wysłać '<< 131, 116, 0, 0, 0, 2, 100, 0 ... >>' poprzez protokół tekstowy, taki jak redis czy memcached? – Krut

+1

@Krut Redis obsługuje surowe dane binarne (myślę, że faktycznie komunikuje się tylko z surowymi danymi binarnymi). Zaktualizowałem swoją odpowiedź małym przykładem. – whatyouhide

Powiązane problemy