Data structures 将队列存储在哈希表或向量的向量中

Data structures 将队列存储在哈希表或向量的向量中,data-structures,hashmap,queue,client-server,server-side,Data Structures,Hashmap,Queue,Client Server,Server Side,我有一个服务器-多客户端服务器-在接收到来自客户端的消息时,服务器需要对其进行处理,然后才能将其传递到另一个客户端 我不知道什么是最好的实施是我想做的,所以将感谢任何帮助。这些消息将以一定的时间间隔发送,因此在从要在特定时间发送的结构访问之前,需要接收、处理消息并将其推入结构中。消息有两个属性:目的地和优先级。访问将以两种模式的时间间隔执行:特定于客户端节点,或对所有节点开放以接收 如果时间间隔仅允许特定节点接收,则会从最高优先级到最低优先级检查所有队列,即以最高优先级发送的最早消息将从结构中“

我有一个服务器-多客户端服务器-在接收到来自客户端的消息时,服务器需要对其进行处理,然后才能将其传递到另一个客户端

我不知道什么是最好的实施是我想做的,所以将感谢任何帮助。这些消息将以一定的时间间隔发送,因此在从要在特定时间发送的结构访问之前,需要接收、处理消息并将其推入结构中。消息有两个属性:目的地和优先级。访问将以两种模式的时间间隔执行:特定于客户端节点,或对所有节点开放以接收

  • 如果时间间隔仅允许特定节点接收,则会从最高优先级到最低优先级检查所有队列,即以最高优先级发送的最早消息将从结构中“推出”
  • 如果时间间隔为“打开”,则无论节点如何,优先级最高的最早消息都将被“推出”
    我首先认为它可能是一个
    向量h除非你对大小和速度有概念,否则没有人能回答这个问题。所以,我想我会写下一些我想到的选项

    选项1——超级计算机:假设我们假设一台超高速机器,与所涉及的数据量相比。我们可以简单地将消息存储在一个无序的列表中,因为这样每次都可以快速浏览列表(平均来说,我们需要浏览一半的列表)

    选项1A——让我们麻烦一点:按优先级+到达时间排序的列表将使“打开”响应快速,因为我们只从“顶部”开始。对于特定于节点的响应,我们通常会搜索不到一半的响应,因为最高优先级都接近开始

    选项2——低资源、100个节点、数百条消息:如果在数据结构中插入时间不是那么重要,并且在需要发送消息时,您只需获得尽可能短的响应,那么您需要一个全局队列,以便在间隔打开时弹出。您还需要特定于节点的队列。最后,您需要一种即时到达特定于节点的队列的方法。这意味着:

  • 全局有序列表
  • N节点特定有序列表
  • 映射由节点Id设置关键帧,并指向特定于节点的列表
  • 在我看来,最痛苦的部分是同步,以便每次都从全局列表和节点特定列表中删除(添加时相同)

    我的第一个想法是将每条消息包装在一个包装器中,该包装器的作用类似于双链接列表中的节点。然而,它实际上是两个列表。包装器将具有基于全局优先级的Prev和Next;但是,它还将根据特定于节点的优先级设置Prev和Next。这样,您只有一份取出的消息本身,同时以标准方式修复上一个/下一个指针。(这基本上结合了上面的#1和#2)

    对于#3,我会保留一个映射,但它不会查找特定于节点的列表,而是指向特定节点的“head”包装

    这里有一张图片来说明。


    听起来很有趣

    除非对尺寸和速度有概念,否则没有人能回答这个问题。所以,我想我会写下一些我想到的选项

    选项1——超级计算机:假设我们假设一台超高速机器,与所涉及的数据量相比。我们可以简单地将消息存储在一个无序的列表中,因为这样每次都可以快速浏览列表(平均来说,我们需要浏览一半的列表)

    选项1A——让我们麻烦一点:按优先级+到达时间排序的列表将使“打开”响应快速,因为我们只从“顶部”开始。对于特定于节点的响应,我们通常会搜索不到一半的响应,因为最高优先级都接近开始

    选项2——低资源、100个节点、数百条消息:如果在数据结构中插入时间不是那么重要,并且在需要发送消息时,您只需获得尽可能短的响应,那么您需要一个全局队列,以便在间隔打开时弹出。您还需要特定于节点的队列。最后,您需要一种即时到达特定于节点的队列的方法。这意味着:

  • 全局有序列表
  • N节点特定有序列表
  • 映射由节点Id设置关键帧,并指向特定于节点的列表
  • 在我看来,最痛苦的部分是同步,以便每次都从全局列表和节点特定列表中删除(添加时相同)

    我的第一个想法是将每条消息包装在一个包装器中,该包装器的作用类似于双链接列表中的节点。然而,它实际上是两个列表。包装器将具有基于全局优先级的Prev和Next;但是,它还将根据特定于节点的优先级设置Prev和Next。这样,您只有一份取出的消息本身,同时以标准方式修复上一个/下一个指针。(这基本上结合了上面的#1和#2)

    对于#3,我会保留一个映射,但它不会查找特定于节点的列表,而是指向特定节点的“head”包装

    这里有一张图片来说明。


    听起来很有趣

    要澄清的是,每条消息是否总是指向一个节点?另外,可能的节点数量是多少(至少是一个非常粗略的范围:数十、数百、数千)?@Darius消息最初只发送给一个节点(随后可能会实现广播)。节点的可能数量将从数十个到数百个不等。很抱歉没有说清楚!要澄清的是,每条消息是否总是指向一个节点?另外,可能的节点数(至少)是多少