我正在将 GAE/Java 与 Objectify 一起使用,并且我正在尝试找到最快的方法来检查给定对象是否存在于数据存储中,给定密钥。我现在正在做的是.get(key)
on @Cached
,但无论哪种方式仍然检索整个对象,这是不必要的。
关于如何仅使用索引来执行此操作的任何想法?我也在考虑仅键查询,但我看到(在系统状态仪表板上)延迟远不止get
.
我正在将 GAE/Java 与 Objectify 一起使用,并且我正在尝试找到最快的方法来检查给定对象是否存在于数据存储中,给定密钥。我现在正在做的是.get(key)
on @Cached
,但无论哪种方式仍然检索整个对象,这是不必要的。
关于如何仅使用索引来执行此操作的任何想法?我也在考虑仅键查询,但我看到(在系统状态仪表板上)延迟远不止get
.
只需在打开缓存的情况下执行 get() 即可。除非您在 @PostLoad 方法中有很多昂贵的逻辑,否则从 memcache 中获取数据应该比一直到数据存储区进行仅键查询要便宜得多。缓存是你的朋友。
作为旁注,这听起来像是过早的优化。使用最方便的代码构建您的应用程序,然后运行 appstats 并找出应用程序中的实际成本。您可能会发现昂贵的零件并不是您想的那样。
关于如何仅使用索引来执行此操作的任何想法?我也在考虑一个只有键的查询
仅键查询是获得仅索引命中的唯一方法。是否比 get 快取决于实体的大小和索引的大小。在一个简单的例子中,我得到大约 8 毫秒的获取时间和 13 毫秒的查询时间。您可以使用 AppStats 来确定哪个对您来说更便宜。
带有过滤器的仅键查询__key__
将比在状态仪表板上进行基准测试的查询快得多。它是否比简单地获取我不确定的实体更快 - 试试看,让我们知道!
您可以像这样尝试来自 Objectify 的仅键查询:
public static boolean objectExists(String id, Class<?> objectClass) {
return OfyService.ofy().load().filterKey(Key.create(objectClass, id)).keys().first() != null;
}