Pergunta

Bem, eu acho que tenho uma dúvida muito básico aqui:

Estou desenvolvendo um aplicativo em GAE (Java) e realizar uma consulta para o armazenamento de dados que retorna um monte de entidades, então eu preciso para armazenar em cache-lo. Eu estava usando memcache e ele estava funcionando muito bem, mas se eu manter a lista de entidades em uma variável estática, todo o pedido vai como duas vezes mais rápido do que usar memcache. Eu acho que é porque eu não estou deserializing as entidades o tempo todo.

Qual seria a desvantagem de usar uma variável estática em vez de memcache? Eu não sei se poderia haver várias instâncias do meu aplicativo na nuvem e, portanto, várias instâncias de minha variável estática?

A lista das entidades que eu estou tentando de cache são os melhores (maior pontuação) lugares da última semana. Eu tomo essa lista e escolher 5 posts aleatórios e mostrá-los em um par de páginas.

Obrigado pela ajuda!

Foi útil?

Solução

App Engine escalas através da criação de novas instâncias de seu aplicativo como o número de usuários que batem aumenta. Como drudru disse, diferentes usuários podem ser servidos por diferentes instâncias. Em geral, memcache é o lugar mais rápido para armazenar algo que você quer ser globalmente consistente. No entanto, no seu caso, pode haver algum espaço para melhorias.

Você menciona que você tem uma lista de mensagens e você escolher aleatoriamente 5 para mostrar aos usuários. Não importa se 2 usuários diferentes ver um conjunto diferente de 5? Se você está escolhendo os aleatórios de qualquer maneira, talvez não importa. Então você pode armazenar a lista completa de postos no memcache, e puxe 5 os aleatórios fora do memcache e armazená-los em uma variável estática.

Em segundo lugar, o que exatamente você memcaching, e como você está puxando-o? Você está armazenando um monte de mensagens completas no memcache, ficando todos eles, em seguida, escolher 5? Talvez você poderia apenas fazer o download da lista de mensagens, escolher 5, e só obter o 5 você precisa? Se você acha que é a desserialização que está retardando para baixo, isso pode ajudar. Você está fazendo qualquer processamento nas mensagens depois que você obtê-los? Se assim for, poderia o resultado de que o processamento seja armazenada em cache?

Outras dicas

Você não pode confiar em variáveis ??estáticas (ou qualquer outra coisa na memória JVM) para ser em torno de quando os próximos sucessos pedido, porque o Google é livre para iniciar e parar as máquinas virtuais quando se sentem como ele. Desde a aparência dela, eles parecem preferir começar JVMs adicionais em vez de tópicos adicionais na mesma JVM, o que agrava o problema.

Mas, você deve ser capaz de usar variáveis ??estáticas como uma camada de cache, desde que você tenha uma maneira de carregar os dados de outro lugar se ele foi embora.

Eu também não tentar ir ao mar com o uso de memória lá, deve haver uma quota de quanta memória você pode usar.

Sim, não há garantia de que o seu exemplo será o mesmo para vários usuários na internet. Você pode acabar constantemente lendo isso em um estático no pior caso. O memcache tem uma garantia maior de estar disponível. Gostaria apenas de usar o cache de memória, e seu aplicativo não deve ter quaisquer problemas de escala no futuro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top