2015-01-22 16 views
5

Sto recuperando l'utente (con associazione profilo, ecc.) Dal database su quasi tutte le richieste. Vorrei memorizzare nella cache sul server e salvare il database un po 'di lavoro extra. Inizialmente pensando a Redis o Memcached e infine a una cache distribuita supportata da Mnesia.Come serializzare/deserializzare il modello Ecto con associazioni caricate?

So come eseguire il trasporto (di un file binario nel caso di Redis/Memcache sui backend di memorizzazione nella cache) ma come si serializza e deserializza il modello in un file binario?

risposta

11

È possibile provare a utilizzare le funzioni :erlang.term_to_binary/1 e :erlang.binary_to_term/1 (piccoli frammenti di documentazione here).

piccolo esempio:

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} 

Dovrebbe funzionare con praticamente tutto (credo!).

In Redis, in particolare, è possibile inviare direttamente dati binari grezzi al server Redis e convertirli nuovamente a strutture di dati Elixir dopo averli recuperati dal server (nuovamente come dati binari). Ecco un piccolo esempio (utilizzando 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

Pensi che la codifica Base64 è il modo migliore per inviare '<< 131, 116, 0, 0, 0, 2, 100, 0 ... >>' via un protocollo di testo come redis o memcached? – Krut

+1

@Krut Redis supporta dati binari non elaborati (penso che in realtà comunichi solo con dati binari non elaborati). Ho aggiornato la mia risposta con un piccolo esempio. – whatyouhide

Problemi correlati