Usar a cache de memória

Esta página descreve como configurar e monitorizar o serviço de memcache para a sua aplicação através da consola. Google Cloud Também descreve como usar a API Python memcache do App Engine para definir e obter valores em cache, e usar a funcionalidade de comparação e definição para processar pedidos de escrita concorrentes para a mesma chave memcache. Para saber mais sobre o memcache, leia a vista geral do memcache.

Configurar a cache de memória

  1. Aceda à página Memcache na Google Cloud consola.
    Aceda à página do Memcache
  2. Selecione o nível de serviço de memcache que quer usar:

    • Partilhada (predefinição): gratuita e oferece capacidade de cache com base no melhor esforço possível.
    • Dedicado: faturado por GB/hora do tamanho da cache e oferece uma capacidade de cache fixa atribuída exclusivamente à sua aplicação.

    Saiba mais acerca das classes de serviço disponíveis na Vista geral do Memcache.

Colocar em cache e obter valores

Colocar um valor em cache

Use add() para adicionar o valor de uma chave se, e apenas se, 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 tempo de expiração de uma hora a partir do momento em que o valor é escrito:

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 memcache.

Veja outros exemplos de valores de colocação em cache em Exemplos de Memcache.

Procurar valores em cache

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

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

Por exemplo, para obter 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 memcache.

Monitorização da memcache na Google Cloud consola

  1. Aceda à página Memcache na Google Cloud consola.
    Aceda à página da cache de memória
  2. Consulte os seguintes relatórios:
    • Nível de serviço do Memcache: mostra se a sua aplicação está a usar o nível de serviço partilhado ou dedicado. Se for proprietário do projeto, pode alternar entre os dois. Saiba mais sobre os níveis de serviço.
    • Rácio de resultados: mostra a percentagem de pedidos de dados que foram apresentados a partir da cache, bem como o número bruto de pedidos de dados que foram apresentados a partir da cache.
    • Itens na cache.
    • Idade do item mais antigo: a idade do item em cache mais antigo. Tenha em atenção que a antiguidade de um item é reposta sempre que é usado, seja lido ou escrito.
    • Tamanho total da cache.
  3. Pode realizar qualquer uma das seguintes ações:

    • Nova chave: adicione uma nova chave à cache.
    • Encontrar uma chave: obtenha uma chave existente.
    • Limpar cache: remove todos os pares de chave-valor da cache.
  4. (Apenas memcache dedicado) Consulte a lista de Chaves populares.

    • As "chaves frequentes" são chaves que recebem mais de 100 consultas por segundo (CPS) na memória cache.
    • Esta lista inclui até 100 teclas de atalho, ordenadas pela CPS mais elevada.

Processamento de escritas simultâneas

Para usar a funcionalidade de comparação e definição para processar gravações de vários pedidos para a mesma chave de memcache:

  1. Instancie um objeto Client memcache.
  2. Use um ciclo de repetição (de preferência, com um limite no número de repetições e usando retirada exponencial)
    1. No ciclo de repetição, obtenha a chave através de gets() ou get_multi() com o parâmetro for_cas definido como True.
    2. No ciclo de repetição, atualize o valor da chave com cas() ou cas_multi().

O fragmento seguinte mostra uma forma de usar a funcionalidade 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 ciclo de repetição é necessário porque, sem o ciclo, este código não evita realmente as condições de concorrência, apenas as deteta! O serviço memcache garante que, quando usado no padrão apresentado aqui (ou seja, usando gets() e cas()), se duas (ou mais) instâncias de cliente diferentes estiverem envolvidas numa condição de concorrência, apenas a primeira a executar a operação cas() tem êxito (retorna True), enquanto a segunda (e as subsequentes) falha (retorna False).

Outro refinamento que deve adicionar a este código de exemplo é definir um limite para o número de novas tentativas, para evitar um ciclo infinito nos piores cenários em que existe muita contenção para o mesmo contador. Um exemplo de quando tal contenção pode ocorrer é se houver mais pedidos a tentar atualizar o contador do que o serviço de memcache consegue processar em tempo real.

Saiba mais sobre a comparação e a definição na vista geral do Memcache.

O que se segue?