1

如果我有简单的关系(95% 的查询取决于 ID),那么使用数据库的确切意义是什么。

我正在存储用户及其统计信息。

如果我可以有简洁的结构,我为什么要使用外部数据库:

db.users[32] = something

500K 用户的数组对于 RAM 来说并不是那么大的努力

优点是:

  • 没有问题的异步(即时结果)
  • 轻松导出/导入
  • 像处理本机对象一样处理数据库

附言。和考虑:

  • 这样做会更快还是更collection[3]db.query("select ...
  • 我要将它存储为文件/s
  • 只有一个应用程序/进程访问这些数据,代码是逐行执行的——请不要详细说明锁定。
  • 请不要回答数据库命题,但为什么要在本机数组/对象上使用外部数据库-我在一些数据库方面有经验-事实并非如此。
  • 我正在构建的是客户端/网关/服务器游戏。网关处理所有用户数据、处理、身份验证、写入统计信息等,软件的其他部分无需直接访问此数据/数据库。
4

2 回答 2

2

这取决于对数据的持久性、延迟和生命周期的要求。在内存中访问数据结构几乎总是比将网络跳转到外部数据库要快得多,但有一些事情需要考虑。

您可以将其仅保留在内存中,但如果您的进程由于某种原因被回收,它就消失了。对于您的情况,这可能没问题...

如果您有多个具有负载平衡(而不是分区)的前端/进程或没有亲和性,您也可能会遇到问题。在某些情况下,内存状态可能会出现问题。还有像memcached这样的选项来解决这样的问题。

memcached 是 facebook 如何解决此类问题的: http: //www.facebook.com/note.php? note_id=39391378919

与 facebook 类似,您还可以将数据持久保存在数据库中(无论是 SQL 还是像 mongodb 这样的 NoSQL)并缓存在内存中以提高效率。如果您在内存中缓存并且它由数据库支持,那么您必须担心该数据的延迟以及如何刷新它。memcached 也是此类场景的解决方案。要么你写你自己的机制来捎带数据,有轮询(尽量避免)等等......这基本上就是fb正在做的事情 - 使用数据库但通过分布在内存缓存中卸载数据库负载。从那个帖子:

memcached 是一个高性能的分布式内存对象缓存系统。在 Facebook,我们可能是世界上最大的 memcached 用户。我们使用 memcached 来减轻数据库负载。

于 2012-10-10T00:28:26.997 回答
1

这将是一个比任何事情都更周到的答案。您在这里还需要考虑的一件事是您的语言。我是一名 PHP 程序员,我为数据库感到高兴。

尝试在 PHP 中将 500K 用户数组存储在内存中(并对其进行操作)将是一场活生生的噩梦,事实上它可能对于大多数语言来说都是如此。数据库使用对预定义索引的对数时间函数来实施搜索策略来克服这种情况。

你也得到了成本因素。将其存储在同一服务器上的 MySQL 或 MongoDB 数据库中实际上更便宜,因为您很可能需要更少的内存来保存您的信息。

我会在这样一个数组的负载下认真测试你的内存消耗,我也猜这只是许多数组中的一个,对吧?

收集 [3] 会比 db.query("select ...

现在这取决于,我不确定 node.js 如何处理数组和迭代到其中的特定索引,但有些语言不会对索引进行 O(log n) 搜索,这意味着你只会做 O(n ) 搜索,这实际上比直接调用 SQL 表的索引要慢。很公平,考虑到 SQL 创建结果集、将其写入磁盘然后响应 node.js 来获取它所需的时间,它可能会更慢。

所以 node.js 在小索引或对象上肯定会更快,但在更大的索引或对象上……我不确定。

只有一个应用程序/进程访问这些数据,代码是逐行执行的——请不要详细说明锁定。

这很令人惊讶。在此之前,我不得不轻松启动多个 node.js 服务器。事实上,为了保持理想的网络托管环境,如果您的主服务器出现故障,您应该始终准备好另一台服务器来参与战斗(相信我确实如此......)。考虑到这一点,我认为您在这里没有考虑锁定和分布式数据的中央存储点有点奇怪。

于 2012-10-10T07:57:49.127 回答