【问题标题】:How can I store the date with datastore?如何使用数据存储存储日期?
【发布时间】:2017-01-17 06:13:36
【问题描述】:

Datastore 文档非常清楚,如果您包含“单调递增的值”(例如当前的 unix 时间),则“热点”存在问题,但是没有提到一个好的替代方案,也没有解决是否存储完全相同(而不是增加值)会创建“热点”:

“不要为具有单调递增值(例如 NOW() 时间戳)的属性编制索引。维护这样的索引可能会导致热点影响具有高读写率的应用程序的 Cloud Datastore 延迟。” https://cloud.google.com/datastore/docs/best-practices

我想存储每个特定实体插入数据存储区的时间,但如果不可能,只存储日期也可以。

不过,这似乎更有可能导致“热点”,因为 24 小时内的每个新实体都会被添加到同一个索引中(无论如何这是我的理解)。

也许关于索引的工作原理(我很难找到关于它们的工作原理的很好的解释)以及一遍又一遍地拥有相同的值索引是好的,但递增值不是。

如果有人对此问题有答案,或者有更好的关于数据存储索引如何工作的文档,我将不胜感激。

【问题讨论】:

  • 我有同样的想法来存储日期而不是小时/分钟/秒。我认为它不会导致比存储完整时间戳更多的热点。假设有一个平板电脑处理请求,它在高负载下分成两个平板电脑。拆分可能导致 tabletA 处理 day0 到 day15,而 tabletB 处理 day16 到 day31。无论您存储 day0 的完整时间戳还是纯日期,tabletA 仍会处理负载。因此,存储纯日期可能不会比存储完整时间戳更糟糕。然而,问题是它是否会更好。
  • 我们先把日期放在一边。他们如何在高负载下处理简单的布尔值和枚举值?我猜他们会分裂一些重叠,否则它不会扩展。例如。 tabletA 可以处理 val1、val2,tablet B 可以处理 val2、val3。将这个概念应用于日期时,也许他们可以拆分,使得 2 个平板电脑可以在同一天共享相同的负载。但是,一年中有很多天,它们可能不会以使 2 个平板电脑处理同一天的方式进行拆分。那么,也许它终究没有多大帮助?我不知道他们是如何确定分裂的。

标签: google-app-engine google-cloud-datastore


【解决方案1】:

您的应用程序是否真的计划查询日期?如果没有,请考虑简单地不索引该属性。如果您只需要不经常读取该属性,请考虑编写 mapreduce 而不是索引。

该建议是根据 BigTable 平板电脑的工作方式给出的,如下所述:https://ikaisays.com/2011/01/25/app-engine-datastore-tip-monotonically-increasing-values-are-bad/

据我所知,更重要的是让实体的主键不是单调递增的数字。最好有一个字符串键,这样实体可以更好地分布存储。

但作为非专家这么说,我无法想象具有单调值的单个属性的索引会出现问题,如果它是合法需要的。例如,我知道在 Nomulus 代码库中,我们有合理的时间索引需求,因为我们想删除早于特定时间的提交日志。

我认为这些单调索引发生的一件很酷的事情是,当这些平板电脑拆分不发生时,获取索引中最左边或最右边的元素实际上比获取索引中间的内容具有更好的延迟属性。例如,如果您执行的查询只获取索引中的第一个结果,它实际上可以比键查找更快。

【讨论】:

    【解决方案2】:

    Justine 链接到的页面中有一个关键引语非常有帮助:

    作为开发人员,您可以做些什么来避免这种情况? ...降低您的写入率,弄清楚如何更好地分配价值。

    只要实体的写入速率较低,就可以存储索引时间戳。

    如果您有一个要存储索引时间戳的实体,并且该实体的写入速率很高,那么解决方案是将实体拆分为两个实体。实体 A 将具有需要经常更新的属性,而实体 B 将具有时间戳和不经常更新的属性。

    当我这样做时,我为这两个实体提供了一个通用 ID,以便真正轻松地从一个实体到另一个实体。

    【讨论】:

      【解决方案3】:

      您可以尝试仅存储日期并将随机小时、分钟和秒放入时间戳,然后稍后丢弃这些额外数据。 (例如,或者保留小时和分钟并使用随机秒)。我不是 100% 确定这会起作用,但如果您需要索引日期,那么值得一试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-16
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        相关资源
        最近更新 更多