代码之家  ›  专栏  ›  技术社区  ›  Riley Lark

将编码键映射到appengine中较短的标识符

  •  3
  • Riley Lark  · 技术社区  · 15 年前

    我想向客户机发送唯一的引用,以便客户机可以引用回特定的对象。appengine提供的编码密钥有时有50个字节长,我可能只需要2或3个字节(我希望需要4或5个字节,但这不会持续一段时间!).

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

    所以,我想把这些长键映射到更短的键上。一个显而易见的解决方案是在数据存储中存储一个映射,但是当我发送400个对象时,我会进行400个额外的查询,对吗?也许我也可以通过在memcache中保存映射的副本来减少开销。有更好的方法吗?

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

    谢谢,

    赖利

    2 回复  |  直到 15 年前
        1
  •  5
  •   David Underhill    15 年前

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

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

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

    像这样的方案应该比使用datastore/memcache存储自定义映射更简单,速度更快。

        2
  •  1
  •   Franck    15 年前

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

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