6

ほとんどすべてのリクエストで、データベースからユーザー(プロファイルの関連付けなど)を取得しています。サーバーにキャッシュして、データベースの余分な作業を節約したいと思います。最初は Redis または Memcached を考えていましたが、最終的には Mnesia に支えられた分散キャッシュを考えていました。

(Redis/Memcache の場合はキャッシュ バックエンドへのバイナリの) トランスポートを行う方法は知っていますが、モデルをバイナリにシリアル化および逆シリアル化するにはどうすればよいですか?

4

1 に答える 1

13

:erlang.term_to_binary/1および関数を使用してみることができ:erlang.binary_to_term/1ます (小さなドキュメントはこちら)。

小さな例:

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}

それはほとんどすべてで動作するはずです(私は思います!)。

特に Redis では、生のバイナリ データを直接 Redis サーバーに送信し、サーバーから (再びバイナリ データとして) フェッチした後、それらを Elixir データ構造に戻すことができます。以下に小さな例を示します ( 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"}
于 2015-01-22T23:03:26.623 に答える