Database 在内存或SQL中创建高流量临时数据库的最佳方法?
在这个项目中,我将创建一个“NAT-T服务器” 它是一个在某些端口中列出的服务器,其中客户端发送其ID、IP、端口,服务器保留其最后联系时间,以清除旧客户端 ID是唯一的,并且是客户端的定位方式 问题是它必须每秒处理15000个事务。 数据库不需要存储 平均跟踪客户数应为20万 使用SQL server或数据结构实现它的最佳方式是什么?Database 在内存或SQL中创建高流量临时数据库的最佳方法?,database,algorithm,data-structures,Database,Algorithm,Data Structures,在这个项目中,我将创建一个“NAT-T服务器” 它是一个在某些端口中列出的服务器,其中客户端发送其ID、IP、端口,服务器保留其最后联系时间,以清除旧客户端 ID是唯一的,并且是客户端的定位方式 问题是它必须每秒处理15000个事务。 数据库不需要存储 平均跟踪客户数应为20万 使用SQL server或数据结构实现它的最佳方式是什么? 切换数据结构?因此,您需要能够按ID插入、定位、更新和删除项目。您还需要清除一段时间内未访问的客户端。假设时间由一个常数定义:OldClientRemovalI
切换数据结构?因此,您需要能够按ID插入、定位、更新和删除项目。您还需要清除一段时间内未访问的客户端。假设时间由一个常数定义:
OldClientRemovalInterval
客户端数据结构将包含ID、IP、端口和上次访问时间
这里有一种方法:
保存客户端记录的关联数组,其中的密钥是ID。C++标准模板库有几个不同的关联数组数据结构(<代码> MAP<代码> >代码> Hasymap Mux/Cuff>等)。
散列映射提供了非常快的访问时间。您可以非常快速地插入、更新或删除项目
对于删除,请维护一个FIFO队列,该队列包含客户端ID和预期的删除时间。每当插入或更新客户端记录时,创建第二个结构{ClientID,RemovalTime}
,通过将OldClientRemovalInterval
添加到当前时间来计算RemovalTime
队列中的项目通过增加移除时间进行排序。定期检查队列,删除删除时间已过期的所有项目
但是,请注意,客户机在添加到队列后可能已被更新。因此,当您从队列中取出某些内容时,必须在关联数组中查找该客户机,并确定是否确实需要删除它。比如:
ClientID = RemoveItemFromQueue();
Client = GetClientRecord(ClientID);
ClientRemovalTime = Client.LastAccess + ClientRemovalInterval;
if (ClientRemovalTime <= CurrentTime)
RemoveClient(ClientId);
这将避免花费太多的时间来删除,但平均而言,可以防止旧客户端阻塞数据结构。唯一的缺点是,如果没有插入/更新,则不会进行删除。因此,在长时间不活动之后,表中可能会充满旧客户机。如果这很重要,您可以使用一个计时器定期发送一个空请求(例如,具有一个特殊的客户端ID-1),该请求不会更新关联数组,但会执行删除操作。根据您的描述,任何类型的SQL数据库似乎都过大。但是,为了提出一个好的建议,如果您能告诉我们您使用的是什么编程语言/环境,并且如果“清除旧客户机”是您唯一的要求,这会有所帮助。要求服务器“注册”一个客户端,“定位”一个客户端并回答此请求并“注销”一个客户端。了解您期望的客户端数量、您希望将它们保留在内存中的时间以及您的计算机上有多少内存也会很有帮助。对于某种哈希表或平衡二叉树,每秒15K个事务应该没有问题,只要其中没有太多的项。Jim,应该同时有200k个客户端。内存是灵活的12GB应该没有问题这是家庭作业吗?这个临时数据库将如何使用?谢谢,非常好的见解!
InsertOrUpdateClient();
// now remove up to 2 items
for (int i = 0; i < 2; ++i)
{
if (queue.Peek().RemovalTime >= CurrentTime)
{
// Remove item from queue,
// and potentially remove client from associative array.
}
else
{
break;
}
}