【问题标题】:Caching Array from DB (MongoDB) in Node.js / Express.js在 Node.js / Express.js 中从 DB (MongoDB) 缓存数组
【发布时间】:2011-06-16 16:37:24
【问题描述】:

我想在 Heroku 上的 Rails 应用程序中添加用户搜索自动完成功能(如 Facebook 的),由于并发要求,我选择用 Node.js 编写它。搜索首先从 Mongo 中提取用户的朋友列表(id 的,包括所有 twitter 朋友,而不仅仅是他们在我们网站上的朋友),然后在该列表中搜索用户,然后再次搜索与该查询匹配的任何其他用户不在好友搜索返回的结果中。

起初这相当快(约 150 毫秒),但对于有更多朋友(例如,总共 100 个以上)的用户来说,加载他们的朋友数组最终成为一个巨大的瓶颈,线性地减慢搜索速度到最大值拥有 1,000 个好友的用户大约需要 1500 毫秒(自动完成好友搜索支持的最大数量)。

问题是,我对 Node.js 和 Express(它的类似 Sinatra 的 Web 框架)完全陌生,而且我不知道如何缓存 Friends 数组,所以我只需要加载一次(最好加载到内存中) )。在 Heroku 上的 Rails 中,我只需将数组加载到 Memcache 中,但我什至不确定如何在 Node/Express 中配置 Memcache,更不用说 Heroku 是否支持了。

有什么想法吗?

(另外请注意,我正在为所有这些查询建立多键索引,包括好友 ID)

【问题讨论】:

    标签: memcached mongodb heroku node.js


    【解决方案1】:

    我想 mongodb 将是完成匹配的地方。似乎您正在尝试将所有结果返回到您自己的代码中,然后自己将它们匹配到一个数组中。您可能会发现让 mongodb 为您过滤掉前 10 个匹配结果然后直接发送给客户端会更快。

    关于数据库的最好的部分是它们可以为您快速地执行此过滤。它的规模应该远远超出其他解决方案。相信数据库,mongodb 的全部意义在于查询应该非常快并且接近 memcache 的速度。你只需要问它正确的问题。我想你可以用力锤击数据库,但请确保只请求你打算使用的确切匹配数。

    为了匹配 John Smi... 也许是这样的(我只是为了展示这个想法而编造的):

    friendIdList //假设是您应用中的简单 id 数组

    var matchFriends = db.people.find( { person_id : { $in :friendIdList }, name : /john smi.*/i } ).sort( { name : 1 } ).limit(10);

    查看关于正则表达式查询的 mongodb 文档

    希望这会有所帮助,我只是在学习 mongodb,而不是专家,但这是我在其他数据库上解决问题的方法

    【讨论】:

      【解决方案2】:

      我对 Node.js 或 Express 知之甚少。但是,我可以告诉您,您可能希望在客户端执行此操作。 (即:cookie 客户端上的好友列表并使用 javascript 搜索

      如果您查看 FB 的实施,这就是他们正在做的事情(至少几个月前是这样)。

      【讨论】:

        【解决方案3】:

        我建议,如果您不打算将名称全部预加载到客户端,那么您最好在输入第一个字符后进行搜索。这会将您需要搜索的名称数量减少到一小部分,然后将该请求提交给数据库。然后,您可以按字母顺序返回这些结果,一旦键入更多字符,您就可以过滤而不进行排序。只要用户没有数千个名为“David Smith”的朋友,则每个请求都应满足您的 150 毫秒目标。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-31
          • 1970-01-01
          • 1970-01-01
          • 2020-07-19
          • 2015-08-14
          • 2011-10-12
          • 1970-01-01
          相关资源
          最近更新 更多