Como usar o Memcache

Nesta página, você aprenderá a configurar e monitorar o serviço Memcache do seu aplicativo usando o Console do Google Cloud Platform. Você também verá como usar a API memcache Python do App Engine para definir e recuperar valores armazenados em cache e usar o recurso de comparação e definição para processar solicitações de gravação simultâneas para a mesma chave do Memcache. Para saber mais sobre o Memcache, leia a Visão geral do Memcache.

Como configurar o Memcache

  1. Acesse a página do Memcache no Console do Google Cloud Platform.
    Acessar a página "Memcache"
  2. Selecione o nível de serviço do Memcache que você quer usar:

    • Compartilhado (padrão): é gratuito e fornece capacidade de cache com base no melhor esforço possível.
    • Dedicado: é cobrado por GB/hora do tamanho do cache e fornece capacidade de cache fixa atribuída exclusivamente ao seu aplicativo.

    Saiba mais sobre as classes de serviços disponíveis na Visão geral do Memcache.

Como armazenar valores em cache e como recuperá-los

Como armazenar um valor em cache

Use add() para adicionar o valor de uma chave se e somente se ainda não existir com uma hora de expiração opcional:

memcache.add(key="[KEY]", value="[VALUE]", time=[EXPIRATION_TIME])

Por exemplo, para adicionar o valor raining à chave weather_USA_98105 com uma hora de expiração de uma hora a partir de quando o valor foi gravado:

memcache.add(key="weather_USA_98105", value="raining", time=3600)

Saiba mais sobre add() e outros métodos para definir valores na documentação da API memcache Python.

Consulte outros exemplos de valores armazenados em cache em Exemplos do Memcache.

Como pesquisar valores armazenados em cache

Use get() para pesquisar o valor de uma única chave:

memcache.get(key="[KEY]")

Por exemplo, para receber o valor da chave weather_USA_98105:

memcache.get(key="weather_USA_98105")

Saiba mais sobre get() e outros métodos para pesquisar valores na documentação da API memcache Python.

Como monitorar o Memcache no console do Google Cloud Platform

  1. Acesse a página do Memcache no Console do Google Cloud Platform.
    Acessar a página "Memcache"
  2. Veja os seguintes relatórios:
    • Nível de serviço do Memcache: mostra se o aplicativo está usando o nível de serviço Compartilhado ou Dedicado. Se você for proprietário do projeto, poderá alternar entre os dois. Saiba mais sobre os níveis de serviço.
    • Taxa de acertos: mostra uma porcentagem e o número bruto de acertos e erros do Memcache.
    • Itens no cache.
    • Idade do item mais antigo: a idade do item mais antigo armazenado em cache. Observe que a idade de um item é redefinida sempre que ele é usado, lido ou gravado.
    • Tamanho total do cache.
  3. Você pode realizar uma destas ações:

    • Nova chave: adiciona uma nova chave ao cache.
    • Encontrar uma chave: recupera uma chave existente.
    • Limpar o cache: remove todos os pares de chave-valor do cache.
  4. (Somente no Memcache dedicado) Consulte a lista de chaves com uso intenso.

    • "Chaves de uso intenso" são as que recebem mais de cem consultas por segundo (QPS, na sigla em inglês) no Memcache.
    • Essa lista inclui até 100 chaves de uso intenso classificadas pelo QPS mais alto.
    • Leia o artigo Práticas recomendadas para o Memcache do App Engine para conferir dicas de como distribuir a carga de maneira mais uniforme em todo o keyspace.

Processar gravações simultâneas

Para usar o recurso de comparação e definição para processar gravações de várias solicitações para a mesma chave do Memcache, siga estas etapas:

  1. Instancie um objeto Client do Memcache.
  2. Use um loop de repetição (preferencialmente com um limite no número de tentativas e usando backoff exponencial).
    1. Dentro do loop de repetição, receba a chave usando gets() ou get_multi() com o parâmetro for_cas definido como True.
    2. Dentro do loop de repetição, atualize o valor da chave usando cas() ou cas_multi().

O seguinte snippet mostra uma maneira de usar o recurso de comparação e definição:

def bump_counter(key):
   client = memcache.Client()
   while True: # Retry loop
     counter = client.gets(key)
     if counter is None: raise KeyError('Uninitialized counter')
     if client.cas(key, counter+1):
        break

O loop de repetição é necessário porque, sem ele, esse código não evita efetivamente as condições de corrida, apenas os detecta. O serviço do Memcache garante que, quando usado no padrão mostrado aqui (ou seja, usando gets() e cas()), se duas ou mais instâncias de cliente diferentes estiverem envolvidas em uma condição de corrida, somente a primeira executar a operação cas() será bem-sucedida (retornará True). A segunda e as subsequentes falharão (retornarão False).

Outro refinamento que você precisa adicionar a esse código de amostra é definir um limite para o número de novas tentativas a fim de evitar um loop infinito nos piores cenários em que há muita contenção para o mesmo contador. Um exemplo de quando essa contenção pode ocorrer é caso haja mais solicitações tentando atualizar o contador do que o serviço do Memcache pode processar em tempo real.

Saiba mais sobre comparar e definir na Visão geral do Memcache.

Próximas etapas

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente padrão do App Engine para Python 2