Вопрос

Ну, я думаю, что здесь у меня есть очень серьезные сомнения:

Я разрабатываю приложение в GAE (Java) и выполнение запроса к базе данных, который возвращает большое структур, поэтому мне нужно кэшировать его.Я использовал memcache, и он работал отлично, но если я сохраняю список объектов в статической переменной, весь запрос выполняется в два раза быстрее, чем при использовании memcache.Я думаю, это потому, что я не десериализирую сущности постоянно.

В чем был бы недостаток использования статической переменной вместо этого в memcache?Я не знаю, может ли быть несколько экземпляров моего приложения в облаке и, следовательно, несколько экземпляров моей статической переменной?

Список объектов, которые я пытаюсь кэшировать, - это лучшие записи (с большим количеством баллов) за последнюю неделю.Я беру этот список, выбираю 5 случайных постов и показываю их на паре страниц.

Спасибо за помощь!

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

Решение

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

Вы упоминаете, что у вас есть список постов, и случайным образом выбираете 5 для показа пользователям.Имеет ли значение, если 2 разных пользователя видят разный набор из 5?Если вы все равно выбираете случайные, возможно, это не имеет значения.Затем вы могли бы сохранить полный список записей в memcache и извлечь 5 случайных записей из memcache и сохранить их в статической переменной.

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

Другие советы

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

Но вы должны иметь возможность использовать статические переменные в качестве уровня кэша, при условии, что у вас есть способ загрузить данные из другого места, если они исчезли.

Я бы также не стал переусердствовать с использованием памяти, должна быть квота на то, сколько памяти вы можете использовать.

Да, нет никакой гарантии, что ваш экземпляр будет одинаковым для разных пользователей в Интернете.В худшем случае вы могли бы постоянно считывать это в статику.Кэш памяти имеет более высокую гарантию доступности.Я бы просто использовал memcache, и в будущем у вашего приложения не должно возникнуть проблем с масштабированием.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top