6

我几乎在每个请求中都从数据库中获取用户(具有配置文件关联等)。我想在服务器上缓存并为数据库节省一些额外的工作。最初考虑的是 Redis 或 Memcached,最终是由 Mnesia 支持的分布式缓存。

我知道如何传输(在 Redis/Memcache 到缓存后端的情况下是二进制文件),但是如何将模型序列化和反序列化为二进制文件?

4

1 回答 1

13

您可以尝试使用:erlang.term_to_binary/1and函数(这里: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 回答