Como usar o Memcache

Nesta página, descrevemos como configurar e monitorar o serviço Memcache para seu aplicativo usando o Console do Google Cloud. 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 "Memcache" no Console do Google Cloud.
    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 somente se ela ainda não existir, com um prazo de validade opcional:

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

Por exemplo, para adicionar o valor raining à chave weather_USA_98105 com um prazo de validade de uma hora a partir da data de gravação:

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 Python do Memcache.

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

Como pesquisar valores armazenados em cache

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

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

Por exemplo, para ver o valor da chave weather_USA_98105:

memcache.get(key="weather_USA_98105")

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

Como monitorar o Memcache no Console do Google Cloud

  1. Acesse a página "Memcache" no Console do Google Cloud.
    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 acerto: mostra a porcentagem de solicitações de dados e o número bruto de solicitações de dados que foram exibidos do cache.
    • 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 atalho, classificadas pelo QPS mais alto.

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 espera exponencial).
    1. No loop de repetição, receba a chave usando gets() ou get_multi() com o for_cas parâmetro definido como True.
    2. No 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 memcache garante que, quando usado no padrão mostrado aqui (isto é, usando gets() e cas()), se duas (ou mais) instâncias cliente diferentes estiverem envolvidas em uma condição de corrida, somente a primeira para executar a operação cas() será bem-sucedida (retorna True), enquanto a segunda (e as subsequentes) falhará (retorna 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