Отображение закодированных ключей в более короткие идентификаторы в AppEngine

StackOverflow https://stackoverflow.com/questions/3783143

Вопрос

Я хочу отправлять уникальные ссылки клиенту, чтобы они могли обратиться к конкретным объектам. Кодированные ключи AppEngine предоставляют иногда 50 байтов долго, и мне, вероятно, нужны только два или три байта (я могу надеяться, что нужно понадобиться четыре или пять, но это не будет на некоторое время!).

Отправка больших ключей на самом деле запрещено дорого, поскольку я мог бы отправить 400 ссылок одновременно.

Итак, я хочу сопоставить эти длинные ключи на гораздо более короткие ключи. Очевидное решение состоит в том, чтобы сохранить отображение в хранилище данных, но затем, когда я отправляю 400 объектов, я делаю 400 дополнительных запросов, верно? Может быть, я смягчусь расходы, сохраняя копии отображений в мемкаме также. Есть ли способ лучше?

Могу ли я просто выделить номер из неосласенных клавиш, которые Appengine создает и использует это? Мне нужен только любой идентификатор, который я использую, чтобы быть уникальным в виде сущности, а не во всем приложении.

Спасибо,

Райли

Это было полезно?

Решение

Ключи данных DataStore включают дополнительную информацию, вам не нужно - например, идентификатор приложения. Так что вам определенно не нужно отправлять весь ключи.

Если эти ссылки на определенный вид в вашем хранилище данных, вы можете сделать еще лучше и просто отправить Key_Name или Numeric ID (в зависимости от того, что ваши клавиши используются). Если последний имеет место, то вы можете передавать каждую клавишу всего несколькими байтами (вы можете выбрать либо целочисленную кодировку переменной или фиксированной длины, в зависимости от того, что будет более компактным для вашего конкретного случая [, вероятно, предыдущий до Большинство удостоверений, которые вы отправляете, становится довольно большой]).

Когда вы получаете эти частичные клавиши от пользователя, он должен быть легко восстановить полный ключ, который необходимо получить объекты из хранилища данных. Если вы используете время выполнения Python, вы можете использовать db.Key.from_path(kind_name, numeric_id_or_key_name).

Такая схема, как это, должна быть как более простыми, так и (много) быстрее, чем пытаться использовать DataStore / 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