Dictionary Erlang tcp服务器

Dictionary Erlang tcp服务器,dictionary,tcp,erlang,gen-server,Dictionary,Tcp,Erlang,Gen Server,我正试图编写一个简单的投票踢选项添加到我现有的服务器 我有一个使用gen_server的消息路由器,它使用init([])->{ok,dict:new()}存储所有连接的客户端。路由器与tcp服务器分开,tcp服务器也是gen_服务器,但处理tcp请求,然后将这些请求中继到路由器 因为“事情”是单独处理/存储的,所以我想存储要踢的用户、投票人列表以及是否成功。因此,这需要在某种程度上是全局的,至少在路由器内部是这样,并且理想情况下与客户机指令分开 关于最佳/理想方法有什么想法吗? 我相信我可以创

我正试图编写一个简单的投票踢选项添加到我现有的服务器

我有一个使用gen_server的消息路由器,它使用
init([])->{ok,dict:new()}
存储所有连接的客户端。路由器与tcp服务器分开,tcp服务器也是gen_服务器,但处理tcp请求,然后将这些请求中继到路由器

因为“事情”是单独处理/存储的,所以我想存储要踢的用户、投票人列表以及是否成功。因此,这需要在某种程度上是全局的,至少在路由器内部是这样,并且理想情况下与客户机指令分开

关于最佳/理想方法有什么想法吗?
我相信我可以创建另一个gen_服务器“router”,它将要踢的人存储在一个记录结构中{kick,{voates,Passed}},但我不知道这是否理想。

你想要“一个用户ID、一个选民列表和结果”。让我们看看这是一个元组:

{User :: user_id(), [Voters :: user_id()], Outcome :: boolean()}
没那么难。这些元组的列表——也不难。其中的一个dict有点复杂,因为您最终会得到(基本上,如果这是一个proplist,使用上面的类型):

这是一个有点不高兴处理。例如,您可能希望按结果进行过滤,但现在它被隐藏在一个元组中的一个元组中,而平面元组列表允许进行简单过滤(或者是真正的过滤器,或者只是保护列表理解,或者其他什么),或者使用
lists:keysearch/3
。这使得复杂的搜索变得更加尴尬,特别是如果你想知道某个特定选民投票踢某人多少次的话

使用ETS当然可以使基本问题变得更容易,因为它具有以比使用
keysearch/3
(而且,我假设你有成千上万的例子,所以元组列表是不充分的——但一如既往,先试试这种方法,你可能会发现元组列表是完全充分的!).另一方面,如果搜索案例变得更加复杂,或者案例需要持久存储并仍然受益于内存操作,或者您需要多个索引,等等,那么您应该真正转向Mnesia

除此之外,您处理的是嵌套数据,虽然这实际上在90%的时间里都很好,但在另外10%的时间里,您要么重新创建关系数据(但更糟糕的是,实际效用更低,速度也更慢)或者只是通过一堆巴洛克式的程序代码来实现一种效果,这种效果可以通过简单地使用Postgres之类的东西免费获得(我碰巧非常熟悉这个DB,所以对我来说这是一个“轻量级的解决方案”——我明白这不适用于所有人)

作为参考,您的数据在分解时如下所示(为了示例,假设用户ID是电子邮件地址):


显然,
用户
[投票者]
上面描述的元组的组件引用了用户记录,不太清楚为什么尝试使用元组提取某个用户所投的所有选票的列表是一个如此糟糕的过程。当我们查看分解的数据时,我们意识到这是三个表,我们真的希望能够通过它来运行一个查询如果您有此要求,请使用elf。但是如果您没有此要求,请不要担心,只需在ETS或Mnesia中使用元组即可:-)这种数据在Erlang中非常小。

尝试使用table@kitty我还没用过ets表。我只是简单地读了一下,并没有完全理解它们。我对Erlang语言相当陌生,所以有很多功能我都不知道。如果你能解释一下ets表格是如何以这种方式使用的?
{User, {[Voters], Outcome}}
table user
  attributes
    id       EmailAddress
  conditions
    pk id

table kick
  attributes
    id       UUID
    user     EmailAddress
    outcome  Boolean
  conditions
    pk id
    fk user

table vote
  attributes
    kick     UUID
    user     EmailAddress
  conditions
    pk (kick user)
    fk kick
    fk user