2010-08-04 3 views
5

Я использую GAE/Java с Objectify, и я пытаюсь найти самый быстрый способ проверить, существует ли данный объект в хранилище данных с учетом ключа. То, что я делаю прямо сейчас, - .get(key) с @Cached, но в любом случае, который все еще извлекает весь объект, что не нужно.Самый быстрый способ проверить, существует ли объект

Любые идеи о том, как это сделать, только с индексом? Я также думал о запросе ключей только, но я вижу (на system status dashboard), что латентность намного больше, чем get.

ответ

3

Любые идеи о том, как это сделать с индексом , попали только в хит? Я также думал о только с ответами на вопросы

Ключевой запрос - единственный способ получить индексный удар. Является ли это быстрее, чем получение зависит от размера вашего объекта и размера вашего индекса. В тривиальном примере я получаю около 8 мс для получения и 13 мс для запроса. Вы можете использовать AppStats, чтобы выяснить, что дешевле для вас с реальными данными.

1

Запрос только ключей с фильтром на __key__ будет значительно быстрее, чем запросы, сравниваемые с контрольной панелью состояния. Является ли это быстрее, чем просто выборкой сущности, я не уверен - попробуйте и сообщите нам об этом!

4

Просто выполните get() с включенным кешем. Если у вас нет дорогостоящей логики в методе @PostLoad, для извлечения данных из memcache должно быть значительно дешевле, чем для полного доступа к хранилищу данных даже для запроса только на ключ. Кэш - ваш друг.

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

+0

Да, вы правы, это, вероятно, ... до сих пор чувствует себя очень плохо, хотя. Мне нужно загрузить весь объект + данные, чтобы убедиться, что это имя (ключ) уже выполнено: -/ –

1

Вы можете попробовать ключи только запрос от объективизации так:

public static boolean objectExists(String id, Class<?> objectClass) { 
    return OfyService.ofy().load().filterKey(Key.create(objectClass, id)).keys().first() != null; 
} 
+0

Должно быть '... keys(). First(). Now()! = Null'. В противном случае «LoadResult » сравнивается с нулем, что дает другой результат ([см. API] (http://docs.objectify-appengine.googlecode.com/git/apidocs/com/googlecode/objectify/cmd/QueryExecute.html# первый())). – oliverdm

Смежные вопросы