erlang - 带有 dict 的 gen_server vs mnesia 表 vs ets

标签 erlang dictionary gen-server ets

我正在构建一个 erlang 服务器。
用户向服务器发送 http 请求以更新其状态。
服务器上的 http 请求过程将用户状态消息保存在内存中。
服务器每分钟将所有消息发送到远程服务器并清除内存。
如果用户在一分钟内多次更新其状态,则最后一条消息会覆盖上一条消息。
重要的是在读取所有消息和清除它们之间没有其他进程将
能够编写状态消息。

实现它的最佳方法是什么?

  • 带有 dict 的 gen_server。 key 将是用户 ID。 dict:store/3 将更新或创建状态。 gen_server 解决了“交易”问题。
  • 带有 ram_copies 的 mnesia 表。处理事务,我不需要实现 gen_server。此解决方案是否有太多开销?
  • 重量更轻且有 gen_server 的 ETS 表。是否可以在 ETS 中进行交易?在读取所有消息和清除消息之间锁定表?

  • 谢谢

    最佳答案

    由于您手动进行同步,因此 mnesia 太多了。你显然不需要网络的东西,这就是 ets 和 mnesia 之间的主要区别。

    据我所知,Ets 只是一个围绕 dict/bag/... 的 otp 兼容进程,并且由于您有多个进程访问您的数据,因此您应该使用 ets。

    我为自己想出了以下逻辑:

    Multiple processes on multiple VMs -> mnesia
    Multiple processes on one VM -> ets/dets
    One process -> bag/dict/...
    

    关于erlang - 带有 dict 的 gen_server vs mnesia 表 vs ets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2154376/

    相关文章:

    erlang - 我可以修改由带有外部函数的 gen_server 管理的 map 吗?

    http - Mochiweb 的可扩展性特性

    erlang - 动态模式匹配

    python - 带有键/值类型对的类型提示字典

    python - 扁平化字典列表

    erlang - 如果我删除了 gen_server 模块的进程字典会发生什么?

    linux - Erlang,process_flag trap_exit 从 CLI 杀死了我的 gen_server

    erlang - 在另一个进程上设置 seq_trace

    erlang - 编写 Erlang timeit 函数

    Python - 使用元组比较字典列表 - 意外行为?