我想向客户端发送唯一引用,以便客户端可以引用特定对象。编码键appengine提供有时50个字节长,我可能只需要两个或三个字节(我可能希望需要四个或五个,但这不会有一段时间!)。
发送较大的密钥实际上非常昂贵,因为我可能一次发送400个引用。
所以,我想将这些长键映射到更短的键。一个明显的解决方案是在数据存储区中存储映射,但是当我发送400个对象时,我正在做400个额外的查询,对吧?也许我通过在memcache中保留映射的副本来减少费用。有没有更好的办法?
我可以从appengine创建的未编码密钥中抽出数字并使用它吗?我只需要我使用的任何id,每个实体类型都是唯一的,而不是整个应用程序。
谢谢,
莱利
答案 0 :(得分:5)
数据存储区密钥包含您不需要的额外信息 - 例如应用程序ID。所以你绝对不需要发送整个键。
如果这些引用属于数据存储区中的特定种类,那么您可以做得更好,只需发送key_name或数字ID(无论您使用哪个密钥)。如果是后一种情况,那么您可以只用几个字节传输每个密钥(您可以选择可变长度或固定长度的整数编码,具体取决于哪种情况对于您的特定情况更紧凑[可能是前者直到您发送的大多数ID都非常大。)。
当您从用户收到这些部分密钥时,应该很容易重建从数据存储中检索实体所需的完整密钥。如果您使用的是Python运行时,则可以使用db.Key.from_path(kind_name, numeric_id_or_key_name)
。
这样的方案应该比尝试使用数据存储区/内存缓存存储自定义映射更简单,更快(很多)。
答案 1 :(得分: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)
从用户发回的标识符中检索实体。