

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Neptune 查找缓存可以加快读取查询的速度
<a name="feature-overview-lookup-cache"></a>

Amazon Neptune 实现了一个查找缓存，该缓存使用 NVMe基于`R5d`实例的 SSD 来提高频繁重复查找属性值或 RDF 字面值的查询的读取性能。查询缓存会临时将这些值存储在 NVMe SSD 卷中，在那里可以快速访问它们。

如果需要从集群存储卷而不是内存中检索属性值或文本，则返回大量顶点和边缘或许多 RDF 三元组的属性的读取查询可能会有很高的延迟。示例包括长时间运行的读取查询，这些查询会从身份图形中返回大量全名，或者从欺诈检测图形中返回大量的 IP 地址。随着查询返回的属性值或 RDF 文本数量增加，可用内存会减少，查询执行可能会显著降级。

# Neptune 查找缓存的用例
<a name="feature-overview-lookup-cache-when-to-use"></a>

只有当读取查询返回非常大量的顶点和边缘或 RDF 三元组的属性时，查找缓存才会有所帮助。

为了优化查询性能，Amazon Neptune 使用 `R5d` 实例类型为此类属性值或文本创建大型缓存。这样，从缓存中检索它们要比从集群存储卷中检索它们快得多。

根据经验，只有满足以下所有三个条件时，才值得启用查找缓存：
+ 您会一直在观察到读取查询的延迟时间增加。
+ 在运行读取查询时，您还会发现`BufferCacheHitRatio`[CloudWatch 指标](cw-metrics.md#cw-metrics-available)有所下降（请参阅[使用亚马逊监控 Neptune CloudWatch](cloudwatch.md)）。
+ 在呈现结果之前，读取查询会花费大量时间来实体化返回值（有关确定要为查询实体化多少个属性值的方法，请参阅下面的 Gremlin-Profile 示例）。

**注意**  
此特征*仅*在上述特定情况下有用。例如，查找缓存根本无助于聚合查询。除非您运行的查询会受益于查找缓存，否则没有理由使用 `R5d` 实例类型来代替等效且成本更低的 `R5` 实例类型。

如果您使用的是 Gremlin，则可以使用 [Gremlin `profile` API](gremlin-profile-api.md) 来评测查询的实体化成本。在“索引操作”下，它显示了在执行过程中实体化的项数量：

```
Index Operations
Query execution:
    # of statement index ops: 3
    # of unique statement index ops: 3
    Duplication ratio: 1.0
    # of terms materialized: 5273
Serialization:
    # of statement index ops: 200
    # of unique statement index ops: 140
    Duplication ratio: 1.43
    # of terms materialized: 32693
```

实体化的非数字项的数量与 Neptune 必须执行的项查找数量成正比。

# 使用查找缓存
<a name="feature-overview-lookup-cache-using"></a>

查找缓存仅在 `R5d` 实例类型上可用，默认情况下会自动启用。Neptune `R5d` 实例具有与`R5`实例相同的规格，外加高达 1.8 TB 的本地固态硬盘 NVMe存储。查找缓存特定于实例，受益的工作负载可以专门定向到 Neptune 集群中的 `R5d` 实例，而其它工作负载可以定向到 `R5` 或其它实例类型。

要在 Neptune 实例上使用查找缓存，只需将该实例升级为 `R5d` 实例类型即可。当您这样做时，Neptune 会自动将 [neptune\$1lookup\$1cache](parameters.md#parameters-db-cluster-parameters-neptune_lookup_cache) 数据库集群参数设置为 `1`（已启用），并在该特定实例上创建查找缓存。然后，您可以使用 [实例状态](access-graph-status.md) API 确认缓存已启用。

同样，要在给定实例上禁用查找缓存，请将该实例从 `R5d` 实例类型缩减到等效的 `R5` 实例类型。

启动 `R5d` 实例时，查找缓存处于启用状态并处于冷启动模式，这意味着它是空的。Neptune 在处理查询时首先在查找缓存中检查属性值或 RDF 文本，如果它们尚不存在，则添加它们。这会逐渐预热缓存。

当您将需要属性值或 RDF 文本查找的读取查询定向到 R5d *读取器*实例时，在缓存预热时读取性能会略有下降。但是，当缓存预热时，读取性能会显著提高，而且您还可能会看到与查询访问缓存而不是集群存储相关 I/O 的成本下降。内存利用率也有所提高。

如果您的*写入器*实例是 `R5d`，则它会在每次写入操作时自动预热其查找缓存。这种方法确实会稍微增加写入查询的延迟，但可以更高效地预热查找缓存。然后，如果您将需要属性值或 RDF 文本查找的读取查询定向到写入器实例，则可以立即开始获得改进的读取性能，因为已在此处缓存了这些值。

此外，如果您在 `R5d` 写入器实例上运行批量加载程序，则可能会注意到由于缓存的原因，其性能略有下降。

由于查找缓存特定于每个节点，因此主机替换会将缓存重置为冷启动。

通过将 [neptune\$1lookup\$1cache](parameters.md#parameters-db-cluster-parameters-neptune_lookup_cache) 数据库集群参数设置为 `0`（已禁用），您可以暂时禁用数据库集群中所有实例上的查找缓存。但是，一般而言，通过将特定实例从 `R5d` 缩减到 `R5` 实例类型来禁用这些实例上的缓存更有意义。