检查谷歌应用引擎数据存储区中是否存在实体.

Vic*_*tor 26 java google-app-engine entity google-cloud-datastore

检查实体是否存在于Google-app-engine数据存储区中的最佳/最快方法是什么?现在我试图通过键获取实体并检查get()是否返回错误.

我不知道在数据存储区上获取实体的过程.有没有更快的方法只做这个检查?

dra*_*onx 6

你提出的建议确实是了解你的实体是否存在的最快方法.减慢速度的唯一因素是获取和反序列化实体所需的时间.如果您的实体很大,这可能会让您失望.

如果此操作(检查是否存在)是您的主要瓶颈并且您拥有大型实体,则可能需要使用两个实体来推送自己的检查系统 - 首先,您将拥有包含数据的现有实体,以及第二个实体或者存储对真实实体的引用,或者可能是一个空实体,其中键只是您可以计算的原始实体键的变体.您可以使用第二个实体快速检查是否存在,然后仅在需要数据时才获取第一个实体.

我认为更好的方法就是设计你的密钥,你知道它们不会重复,或者你的操作是幂等的,这样即使旧的实体被覆盖,也没关系.


Eri*_*ski 5

com.google.appengine.api 已不推荐使用App Engine GCS客户端。

您是否考虑过使用查询?猜测和检查不是一种可扩展的方法,可以从数据存储中找出实体。可以创建查询以从数据存储中检索满足指定条件的实体:

https://developers.google.com/appengine/docs/java/datastore/queries

编辑:

那么仅键查询呢?仅键查询比返回完整实体的查询运行得更快。若要仅返回键,请使用Query.setKeysOnly()方法。

new Query("Kind").addFilter(Entity.KEY_RESERVED_PROPERTY, FilterOperator.EQUAL, key).setKeysOnly();
Run Code Online (Sandbox Code Playgroud)

来源:[1]:http : //groups.google.com/group/google-appengine-java/browse_thread/thread/b1d1bb69f0635d46/0e2ba938fad3a543?pli= 1

  • 不,查询总会花费更长的时间,并且花费更多,因此我认为这不是正确的答案。 (13认同)
  • 使用.setKeysOnly()筛选器进行查询的成本实际上与单个get操作的成本相同(在记帐和有效运行时间方面,因为这主要取决于网络往返时间)。还要注意,对KEY_RESERVED_PROPERTY的查询以特殊方式处理,因为它不像使用任何其他属性那样使用最终的一致索引,而是使用高度一致。尽管没有为这种类型的查询指定仅通过获取键来节省的开销,但这使该答案完全有效。 (2认同)