【发布时间】:2015-01-22 21:12:24
【问题描述】:
我几乎在每个请求中都从数据库中获取用户(与配置文件关联等)。我想在服务器上缓存并为数据库节省一些额外的工作。最初考虑 Redis 或 Memcached,最终考虑使用 Mnesia 支持的分布式缓存。
我知道如何进行传输(在 Redis/Memcache 的情况下将二进制文件传输到缓存后端),但是如何将模型序列化和反序列化为二进制文件?
【问题讨论】:
我几乎在每个请求中都从数据库中获取用户(与配置文件关联等)。我想在服务器上缓存并为数据库节省一些额外的工作。最初考虑 Redis 或 Memcached,最终考虑使用 Mnesia 支持的分布式缓存。
我知道如何进行传输(在 Redis/Memcache 的情况下将二进制文件传输到缓存后端),但是如何将模型序列化和反序列化为二进制文件?
【问题讨论】:
您可以尝试使用:erlang.term_to_binary/1 和:erlang.binary_to_term/1 函数(少量文档here)。
小例子:
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"}
【讨论】:
<<131, 116, 0, 0, 0, 2, 100, 0 ... >> 的最佳方式?