2010-09-23 76 views
3

我想向客户端发送唯一引用,以便客户端可以引用特定对象。 appengine提供的编码键有时候有50个字节长,我可能只需要2或3个字节(我希望能够用到4或5个字节,但这不会有一段时间!)。将编码密钥映射到appengine中的较短标识符

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

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

我可以将这个数字从appengine创建并使用它的未编码密钥中抽出吗?我只需要我使用的任何身份证件就是每个实体类型的唯一身份证件,而不是整个应用程序。

感谢,

莱利

回答

5

数据存储密钥包括你不需要额外的信息 - 如应用程序ID。所以你绝对不需要发送整个密钥。

如果这些引用是针对数据存储库中的特定类型的,那么您可以做得更好,只需发送key_name或数字ID(无论您的密钥使用哪个)。如果后者是这种情况,那么你可以传输每个密钥只有几个字节(你可以选择一个可变长度或固定长度的整数编码,这取决于哪个对于你的特定情况会更紧凑[可能是前者直到大部分你发送的ID都相当大])。

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

像这样的方案应该比试图使用数据存储/内存缓存来存储自定义映射更简单和(很多)。

+0

谢谢,这看起来不错。我使用的是Java,并且http://code.google.com/appengine/docs/java/datastore/creatinggettinganddeletingdata.html看起来好像它将具有我需要清除您的答案的内容。我担心自动生成的ID会很短(数字ID需要Long),但我认为在最坏的情况下,保留我自己的IDS低位并自己生成它们仍然会,比发送整个编码密钥要好的多。谢谢! – 2010-09-26 13:07:50

1

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

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

然后你就可以在一个查询中获取这些短identitiers:

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

最后,使用MyKind.get_by_key_name(short_id)以检索标识由发回的实体你的用户。