【问题标题】:How to serialize/deserialize Ecto model with Loaded associations?如何使用 Loaded 关联序列化/反序列化 Ecto 模型?
【发布时间】:2015-01-22 21:12:24
【问题描述】:

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

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

【问题讨论】:

    标签: elixir ecto


    【解决方案1】:

    您可以尝试使用: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"}
    

    【讨论】:

    • 您认为 base64 编码是通过 redis 或 memcached 等文本协议发送&lt;&lt;131, 116, 0, 0, 0, 2, 100, 0 ... &gt;&gt; 的最佳方式?
    • @Krut Redis 支持原始二进制数据(我认为它实际上只与原始二进制数据通信)。我用一个小例子更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    相关资源
    最近更新 更多