我想向客户端发送唯一的引用,以便他们的客户端可以将其引用到特定对象。 Appengine提供的编码键有时长50个字节,我可能只需要两个或三个字节(我希望需要四到五个字节,但这不会暂时!)。

实际上,发送较大的密钥实际上是非常昂贵的,因为我可能一次发送400个参考。

因此,我想将这些长键映射到较短的键。一个明显的解决方案是将映射存储在数据存储中,但是当我发送400个对象时,我正在执行400个其他查询,对吗?也许我也通过将映射的副本保存在memcache中来减轻费用。有没有更好的办法?

我可以从附录创建的未编码键中拉出数字吗?我只需要我用来使用的任何ID,即每个实体类型,而不是整个应用程序。

谢谢,

莱利

有帮助吗?

解决方案

数据存储键包含您不需要的额外信息 - 例如应用程序ID。因此,您绝对不需要发送 全部的 钥匙。

如果这些引用是您数据存储中某种特定类型的引用,那么您可以做得更好,只需发送key_name或数字ID(无论键使用哪个)即可。如果是后者,则可以仅使用几个字节传输每个键(您可以选择可变长度或固定长度整数编码,具体取决于您的特定情况更紧凑[可能是前者直到您发送的大多数ID都变得很大])。

当您从用户接收这些部分键时,应该很容易地重建从数据存储中检索实体的完整键。如果您使用的是Python运行时,则可以使用 db.Key.from_path(kind_name, numeric_id_or_key_name).

这样的方案应该比尝试使用数据存储/memcache存储自定义映射的方案更简单,而且(很多)。

其他提示

您不需要自定义映射机制。只需使用实体密钥名称存储您的短标识符:

entity = MyKind(key_name=your_short_id)
entity.put()

然后,您可以在一个查询中获取这些简短的标识:

keys = MyKind.all(keys_only=True).filter(...).fetch(400)
short_ids = [key.name() for key in keys]

最后,使用 MyKind.get_by_key_name(short_id) 为了从用户寄回的标识符中检索实体。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top