2015-01-22 11 views
5

Ich hole Benutzer (mit Profilzuordnung usw.) aus der Datenbank bei fast jeder Anfrage. Ich möchte auf dem Server zwischenspeichern und die Datenbank ein wenig zusätzliche Arbeit speichern. Anfangs denken Redis oder Memcached und schließlich ein von Mnesia unterstützter verteilter Cache.Wie wird das Ecto-Modell mit geladenen Assoziationen serialisiert/deserialisiert?

Ich weiß, wie der Transport (einer binären im Fall von Redis/Memcache zu den Caching-Backends), aber wie serialisieren und deserialisieren das Modell zu einer Binärdatei?

Antwort

11

Sie können versuchen, die :erlang.term_to_binary/1 und :erlang.binary_to_term/1 Funktionen (kleine Bits der Dokumentation here) zu verwenden.

Kleines Beispiel:

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} 

Es sollte mit so ziemlich alles funktioniert (ich glaube!).

In Redis können Sie direkt rohe Binärdaten an den Redis-Server senden und diese nach dem Abrufen vom Server wieder in Elixir-Datenstrukturen konvertieren (wiederum als Binärdaten). Hier ist ein kleines Beispiel (mit 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

Denken Sie Base64-Codierung der beste Weg ist, 'zu senden << 131, 116, 0, 0, 0, 2, 100, 0 ... >>' über ein Textprotokoll wie redis oder memcached? – Krut

+1

@Krut Redis unterstützt rohe Binärdaten (ich denke, es kommuniziert nur mit rohen Binärdaten). Ich habe meine Antwort mit einem kleinen Beispiel aktualisiert. – whatyouhide

Verwandte Themen