gpt4 book ai didi

database - 创建高流量临时数据库的最佳方法是内存中还是 SQL?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:04:45 24 4
gpt4 key购买 nike

在这个项目中,将创建一个“NAT-T 服务器”

它是一个在某个端口列出的服务器,客户端在其中发送他们的 ID、IP、端口,服务器保留他们的最后联系时间,以清除旧客户端。

ID 是唯一的,是客户端的定位方式。

问题是它必须每秒处理 15k 个事务。数据库不需要存储。

平均跟踪的客户应为 20 万。

如何实现它的最佳方式是使用 SQL 服务器还是使用数据结构?女巫数据结构?

最佳答案

因此您需要能够按 ID 插入项目、定位、更新和删除项目。您还需要清除一段时间内未访问过的客户端。假设时间由常量定义:OldClientRemovalInterval

客户端数据结构将包含 ID、IP、端口和上次访问时间。

这是一种方法:

维护客户记录的关联数组,键为 ID。 C++ 标准模板库有几种不同的关联数组数据结构(maphash_map 等)。 hash_map 提供非常快的访问时间。您可以非常快速地插入、更新或删除项目。

对于删除,维护一个包含客户端 ID 和预期删除时间的 FIFO 队列。每当插入或更新客户端记录时,创建第二个结构 { ClientID, RemovalTime },通过将 OldClientRemovalInterval 添加到来计算 RemovalTime当前时间。

队列中的项目按移除时间递增排序。定期检查队列,移除所有移除时间已过的项目。

但是请注意,客户端在添加到队列后可能已经更新。所以当你从队列中取出一些东西时,你必须在关联数组中查找那个客户并确定它是否真的需要被删除。像这样的东西:

ClientID = RemoveItemFromQueue();
Client = GetClientRecord(ClientID);
ClientRemovalTime = Client.LastAccess + ClientRemovalInterval;
if (ClientRemovalTime <= CurrentTime)
RemoveClient(ClientId);

这实际上需要数据结构支持每秒 30K 个事务(对于每个插入/更新,都会有相应的查找和可能的删除)。但是 hash_map 应该可以毫无问题地处理它。

如何检查队列由您决定。您可以在计时器或第二个线程上执行此操作,但是您会遇到锁定对队列和关联数组的访问的问题。也许更好的想法是在每次插入/更新后运行删除算法,删除任何时间已过期的项目。或者,为避免在删除过程中花费太多时间,让它为每次插入/更新删除最多两个旧客户端。即:

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;
}
}

这将避免在删除过程中花费太多时间,但平均而言,可以防止旧客户端阻塞数据结构。唯一的缺点是如果没有插入/更新,则不会发生删除。因此,在长时间不活动之后, table 上可能会坐满了老客户。如果这很重要,您可以有一个计时器,它定期发送一个空请求(例如,有一个特殊的客户端 ID 为 -1),它不会更新关联数组,但会执行删除操作。

关于database - 创建高流量临时数据库的最佳方法是内存中还是 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4934560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com