【问题标题】:Storing clients data efficiently有效存储客户数据
【发布时间】:2012-10-21 14:44:02
【问题描述】:

我正在开发一个客户端-服务器应用程序以在多个客户端中分发和执行代码。它必须是这样工作的:

  1. 客户端连接到服务器,每分钟发送一次状态。
  2. 服务器存储客户端 IP 和状态。
  3. 有人向服务器发送要执行的代码。
  4. 服务器搜索免费且活跃的客户端并发送代码。

我的问题是我可以处理的客户数量。我正在考虑使用列表来存储客户对象或类似的东西,但我可能有成千上万的客户,所以这可能不是一个好主意,因为我会用完资源。在不挂起服务器的情况下高效存储所有客户端数据的最佳选择是哪一个?

很抱歉没有显示任何代码,但我目前正处于设计阶段,我对此感到困惑。该项目将使用 Python 开发,但我不需要代码。

【问题讨论】:

  • 这听起来有点像Celery
  • 之前没听说过Celery,不过好像是用来处理任务的。我真正的问题是存储客户数据并足够快地使用它。

标签: python client-server storage


【解决方案1】:

如果您只是担心没有足够的内存来保存所有 Python 数据,您可以腌制它并跟踪例如 ID 和腌制文件Python Docs Pickle

另一个很好的例子是Shelve

这两个方面的好处是不必担心在 SQL 数据库等上对数据进行序列化或建模。

当然,您可以将两者结合使用。腌制数据并将结果字符串保存在数据库的字段中。这样,如果将来需要,您可以简单地添加带有元数据的列。当谈到速度考虑时,您要么将其保存在数据库中以便可以很好地查询它,要么将其保存为文件以摆脱“开销”。小心过早的优化。

【讨论】:

  • 感谢您的评论。实际上,我对数据库上的数据建模没有任何问题。我不这样做是因为使用内存或文件可能太慢了。正如我所说,真正的问题是性能。我将不得不处理很多请求和更新。代码的一部分专注于强制客户端同步不要同时发送更新,但即使这样我也会有很多流量。
  • 如果您不需要查询数据等,可以使用 pickle 或稍微智能的搁置直接将数据序列化到文件中。
  • 其实我没有这个需要,但是以后我可以添加一个网站来显示客户的状态和正在处理的代码。
  • @DavidMorenoGarcía 更新了我的答案,以反映您可以将两者结合起来的事实,以及关于效率的说明
【解决方案2】:

Sqlite是一个lite数据库存储和高效,如果你不喜欢mysql,也可以使用mongoDB(no sql database)

http://www.sqlite.org/

http://www.mongodb.org/

我认为它们比 mysql 更快...

【讨论】:

  • 目前我有一个使用列表的简单而愚蠢的小应用程序,但我只有三个客户端,所以我没有任何问题。棘手的部分是当我将拥有成千上万的客户时。我无法在列表中存储这么多信息,并且可能使用数据库不足以有效地处理所有信息。可能我错了。我只是问,因为我对此的了解非常有限。
  • 数据库 - 只是以二进制格式存储数据的文件,它们旨在获得最佳性能,如果您将数据存储在文件中也会发生同样的情况,但我认为它的工作速度会比以前慢使用数据库,所有最流行的应用程序都在使用数据库,也许一些专家正在根据自己的需要重新制作这些数据库,例如谷歌,例如他们使用 mysql,但据我所知,他们已经修改了 mysql 的算法。 ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2016-04-19
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多