【问题标题】:Custom in-memory cache自定义内存缓存
【发布时间】:2012-08-25 17:43:50
【问题描述】:

想象有一个网络服务:

  • 在服务器集群 (nginx/node.js) 上运行
  • 所有数据都远程存储
  • 必须在 20 毫秒内响应

必须为响应读取的数据是这样拆分的..

BatchA

  • 数以百万计的小对象存储在 AWS DynamoDB 中
  • 在随机时间随机更新
  • 只有一致的读取,不能被捕获

批次B

  • ~2,000 条 SQL 记录
  • 很少更新,最多记录 1KB
  • 最长可捕获 60-90 秒

我们不能一次全部读取它们,因为在我们从 BatchA 读取之前,我们不知道要从 BatchB 获取哪些记录。

从 DynamoDB 读取最多需要 10 毫秒。如果我们从远程位置读取 BatchB,我们将没有时间进行计算,或者我们已经超时。

我目前的想法是将所有 BatchB 记录加载到每个节点的内存中(只有 ~2MB)。启动时,系统将连接到 SQL 服务器并获取所有记录,然后每 60 或 90 秒更新一次。问题是最好的方法是什么

我可以简单地将它们全部读入 node.js 中的变量(数组),然后在 60-90 秒后使用 SetTimeout 更新数组。但是是最好的解决方案吗?

【问题讨论】:

  • 我建议看看 Couchbase 服务器。它在一个产品中提供缓存和数据持久性,并被许多需要高性能和低延迟响应的公司使用。
  • 感谢您的回复,但我无法使用另一个远程数据存储。如果是这种情况,我将能够使用相同的 DynamoDB。此数据应位于每个节点的 RAM 中。

标签: node.js memcached


【解决方案1】:

您的解决方案听起来不错。它符合您的需求。去吧。

我建议在从远程位置更新缓存的过程中保留两个缓存副本。在收到 2MB 时,您已经获得了数据的部分副本。我会保留旧缓存,直到完全接收到新数据。

另一种方法是只维护一个缓存集并在每条记录到达时对其进行更新。然而,这更难以实现并且容易出错。 (例如,如果不再在远程位置找到记录,您不应该忘记从缓存中删除它们。)这种方法可以节省内存,但我认为 2MB 不是什么大问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    相关资源
    最近更新 更多