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