3

我想向客户端发送唯一引用,以便客户端可以引用特定对象。appengine 提供的编码密钥有时有 50 个字节长,而我可能只需要两三个字节(我可能希望需要四五个字节,但暂时不会!)。

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

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

我可以从 appengine 创建并使用它的未编码密钥中提取数字吗?我只需要我使用的任何 id 对每个实体类型都是唯一的,而不是在整个应用程序中。

谢谢,

莱利

4

2 回答 2

5

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

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

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

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

于 2010-09-24T00:54:49.750 回答
1

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

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)从用户发回的标识符中检索实体。

于 2010-09-24T09:30:56.090 回答