Memorizzazione nella cache dei dati con Memorystore

Le applicazioni web scalabili ad alte prestazioni spesso utilizzano una cache di dati in memoria distribuita prima o al posto di un potente spazio di archiviazione permanente per alcune attività. Ti consigliamo di utilizzare Memorystore for Redis come servizio di memorizzazione nella cache. Tieni presente che Memorystore for Redis non fornisce un livello gratuito. Per informazioni dettagliate, vedi
Prezzi di Memorystore.

Prima di iniziare, assicurati che la tua app rimanga entro le quote di Memorystore for Redis.

Quando utilizzare una cache in memoria

I dati della sessione, le preferenze dell'utente e altri dati restituiti dalle query per le pagine web sono ideali per la memorizzazione nella cache. In generale, se una query eseguita di frequente restituisce un insieme di risultati che non devono essere visualizzati immediatamente nell'app, puoi memorizzare i risultati nella cache. Le richieste successive possono controllare la cache ed eseguire query sul database solo se i risultati sono assenti o sono scaduti.

Se memorizzi un valore solo in Memorystore senza averne eseguito il backup in uno spazio di archiviazione permanente, assicurati che l'applicazione si comporti in modo accettabile se il valore scade e viene rimosso dalla cache. Ad esempio, se l'assenza improvvisa dei dati di sessione di un utente causa un malfunzionamento della sessione, probabilmente questi dati dovrebbero essere archiviati nel database oltre che in Memorystore.

Informazioni sulle autorizzazioni di Memorystore

Ogni interazione con un servizio Google Cloud deve essere autorizzata. Ad esempio, per interagire con un database Redis ospitato da Memorystore, la tua app deve fornire le credenziali di un account autorizzato ad accedere a Memorystore.

Per impostazione predefinita, la tua app fornisce le credenziali dell'account di servizio predefinito App Engine, che è autorizzato ad accedere ai database nello stesso progetto della tua app.

Se una delle seguenti condizioni è vera, devi utilizzare una tecnica di autenticazione alternativa che fornisca le credenziali in modo esplicito:

  • La tua app e il database Memorystore sono in progetti Google Cloud diversi.

  • Hai modificato i ruoli assegnati all'account di servizio predefinito di App Engine.

Per informazioni sulle tecniche di autenticazione alternative, consulta la pagina sulla configurazione dell'autenticazione per le applicazioni di produzione server-server.

Panoramica sull'utilizzo di Memorystore

Per utilizzare Memorystore nella tua app:

  1. Configura Memorystore for Redis, che richiede la creazione di un'istanza Redis su Memorystore e la creazione di un accesso VPC serverless che la tua app utilizza per comunicare con l'istanza Redis.

  2. Installare una libreria client per Redis e utilizzare i comandi Redis per memorizzare i dati nella cache.

    Memorystore per Redis è compatibile con qualsiasi libreria client per Redis. Questa guida descrive l'utilizzo della libreria client PHPRedis per inviare comandi Redis dall'app.

  3. Testa gli aggiornamenti.

  4. Esegui il deployment dell'app su App Engine.

Configurazione di Memorystore for Redis

Per configurare Memorystore for Redis:

  1. Crea un'istanza Redis in Memorystore.

    Quando ti viene chiesto di selezionare un'area geografica per l'istanza Redis, seleziona la stessa area geografica in cui si trova l'app App Engine.

  2. Prendi nota dell'indirizzo IP e del numero di porta dell'istanza Redis creata. Utilizzerai queste informazioni quando crei un client Redis nel codice.

  3. Connetti App Engine a una rete VPC. L'app può comunicare con Memorystore solo tramite un connettore VPC.

    Assicurati di aggiungere le informazioni sulla connessione VPC al file app.yaml come descritto in Configurazione dell'app utilizzando il connettore.

Installazione delle dipendenze

Per rendere disponibile la libreria client PHPRedis per la tua app quando viene eseguita in App Engine, aggiungi l'estensione redis.so al file php.ini dell'app. Ad esempio:
; Enable the Redis extension on App Engine
extension=redis.so

Per ulteriori informazioni sull'abilitazione delle estensioni PHP in App Engine, consulta l'articolo sulle estensioni caricabili dinamicamente.

Creazione di un client Redis

Per interagire con un database Redis, il tuo codice deve creare un client Redis per gestire la connessione al tuo database Redis. Le seguenti sezioni descrivono come creare un client Redis utilizzando la libreria client PHPHedis.

Specifica delle variabili di ambiente

La libreria client PHPHedis utilizza due variabili di ambiente per assemblare l'URL per il database Redis:

  • Una variabile per identificare l'indirizzo IP del database Redis creato in Memorystore.
  • Una variabile per identificare il numero di porta del database Redis creato in Memorystore.

Ti consigliamo di definire queste variabili nel file app.yaml dell'app, anziché definirle direttamente nel codice. In questo modo è più facile eseguire la tua app in diversi ambienti, come un ambiente locale e App Engine.

Ad esempio, aggiungi le seguenti righe al file app.yaml:

 env_variables:
      REDIS_HOST: '10.112.12.112'
      REDIS_PORT: '6379'

Importazione di PHPRedis e creazione del client

Dopo aver definito le variabili di ambiente REDIS_HOST e REDIS_PORT, puoi utilizzare le seguenti righe per creare un client Redis:

<?php
/**
 * Copyright 2019 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Only serve traffic from "/"
switch (@parse_url($_SERVER['REQUEST_URI'])['path']) {
    case '/':
        break;
    default:
        http_response_code(404);
        exit('Not Found');
}

// Connect to Memorystore from App Engine.
if (!$host = getenv('REDIS_HOST')) {
    throw new Exception('The REDIS_HOST environment variable is required');
}

# Memorystore Redis port defaults to 6379
$port = getenv('REDIS_PORT') ?: '6379';

try {
    $redis = new Redis();
    $redis->connect($host, $port);
} catch (Exception $e) {
    return print('Error: ' . $e->getMessage());
}

$value = $redis->incr('counter');

printf('Visitor number: %s', $value);

Utilizzo dei comandi Redis per archiviare e recuperare i dati nella cache

Sebbene il database Memorystore Redis supporti la maggior parte dei comandi Redis, devi utilizzare alcuni comandi per archiviare e recuperare i dati dalla cache. La seguente tabella suggerisce i comandi Redis che puoi utilizzare per memorizzare i dati nella cache. Per informazioni su come chiamare questi comandi dalla tua app, consulta la documentazione della libreria client.

Attività Comando Redis
Crea una voce nella cache di dati e
imposta una scadenza per la voce
SETNX
MSETNX
Recupera i dati dalla cache GET
MGET
Sostituisci i valori della cache esistenti IMPOSTA
MSET
Consente di aumentare o diminuire i valori numerici della cache INCR
INCRBY
DECR
DECRBY
Eliminare le voci dalla cache DEL
SCOLLEGA
Supporta le interazioni simultanee con la cache Vedi i dettagli sulle transazioni Redis.

Test degli aggiornamenti

Quando testi l'app localmente, valuta la possibilità di eseguire un'istanza locale di Redis per evitare l'interazione con i dati di produzione (Memorystore non fornisce un emulatore). Per installare ed eseguire Redis in locale, segui le istruzioni nella documentazione di Redis. Tieni presente che al momento non è possibile eseguire Redis localmente su Windows.

Deployment dell'app

Quando l'app è in esecuzione nel server di sviluppo locale senza errori:

  1. Testa l'app su App Engine.

  2. Se l'app viene eseguita senza errori, utilizza la suddivisione del traffico per aumentare il traffico in modo lento per la tua app aggiornata. Monitora attentamente l'app per rilevare eventuali problemi del database prima di indirizzare più traffico all'app aggiornata.