GAE Long ID太久了,有没有办法缩短Long ID?

时间:2015-01-29 21:14:01

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

在本地主机开发期间,GAE生成的ID从1开始。

然而,在云中的真实GAE部署中,即使对于第一个实体生成的ID也很长,例如5639412304721232,是否有解决方案使第一个实体以1,2,3开始..等等?

有人可能会建议使用Sharded Counters,是的我已经使用了这个,但some suggests that sharded counters are not to be used因为app可能得到相同的数量,因为它最终是一致的。

在这种情况下,什么是最好的解决方案?

4 个答案:

答案 0 :(得分:3)

正式帖子解释了从顺序到'分散'ID的转换是here

恢复顺序行为的说明是here,但请注意最终将删除此选项的警告。

“最佳”解决方案取决于您的需求和原因。使用分散的ID,您将获得更好的数据存储性能,但老实说,如果您的应用程序获取少量请求并轻松使用数据存储区,您可能不会注意到太多差异。如果是这种情况,您可以使用基于具有保存当前高水位ID的属性的简单实体来滚动您自己的顺序ID,并依赖于具有低事务率以防止您遇到事务数量限制每个实体。

可靠地在分布式系统中无间隙地发布顺序ID非常具有挑战性。

答案 1 :(得分:2)

请注意,如果您使用连续的长ID快速创建大量实体,则可能会遇到问题。 This post为您解释原因。

理论上,可以选择自动ID生成策略,分散的ID为default since 1.8.1,但由于链接中讨论的原因,旧的单调递增legacy策略将被弃用交。

如果你使用分片计数器,你会避免这种情况,但正如你所说,你可能会遇到其他问题。

答案 2 :(得分:2)

您可以尝试使用allocate_ds。我们使用它来获取系统生成的id的较小整数值。在Python中使用db类:

    model_key = db.Key.from_path('your_kind_name', 1)
    key_batch = db.allocate_ids(model_key, 1)
    id_new = key_batch[0]
    idkey = db.Key.from_path('your_kind_name', id_new)

答案 3 :(得分:1)

我会将密钥的标识符指定为字符串“1”,“2”,“3”......等等,从序列发生器生成它们。您可以检查实体是否已存在get_or_insert()函数。

同样,您可以通过在实体中存储序列号来使用auto-increment solution