Avviso: nei prossimi mesi, stiamo riorganizzando il sito della documentazione di App Engine per semplificare la ricerca di contenuti e l'allineamento con il resto dei prodotti Google Cloud. Saranno disponibili gli stessi contenuti, ma ora la navigazione corrisponderà al resto dei prodotti Cloud. Se hai feedback o domande durante la navigazione nel sito, fai clic su Invia feedback.

Python 2 non è più supportato dalla community. Ti consigliamo di eseguire la migrazione delle app Python 2 a Python 3.

API Memcache per servizi bundle precedenti

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questa pagina fornisce una panoramica del servizio memcache di App Engine. Le applicazioni web scalabili ad alte prestazioni spesso usano una cache di dati in memoria distribuita prima o al posto di un robusto spazio di archiviazione permanente per alcune attività. A questo scopo, App Engine include un servizio di cache di memoria. Per scoprire come configurare, monitorare e utilizzare il servizio memcache, leggi l'articolo sull'utilizzo di Memcache.

Quando utilizzare una cache in memoria

Una cache della memoria viene utilizzata per velocizzare le query comuni del datastore. Se molte richieste richiedono la stessa query con gli stessi parametri e le modifiche ai risultati non devono essere visualizzate immediatamente sul sito web, l'applicazione può memorizzare i risultati nella cache. Le richieste successive possono controllare la cache memcache ed eseguire la query datastore solo se i risultati sono assenti o scaduti. 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.

Memcache può essere utile per altri valori temporanei. Tuttavia, quando valuti se archiviare un valore solo nella memcache e non tramite un altro spazio di archiviazione permanente, assicurati che la tua applicazione si comporti in modo accettabile quando il valore non è improvvisamente disponibile. I valori possono scadere dalla memcache in qualsiasi momento e possono essere scaduti prima della scadenza impostata per il valore. Ad esempio, se l'improvvisa assenza dei dati sulla sessione di un utente causa un malfunzionamento della sessione, probabilmente questi dati dovrebbero essere archiviati nel datastore oltre che nella memcache.

Livelli di servizio

App Engine supporta due livelli di servizio memcache:

  • Memcache condivisa è l'impostazione predefinita gratuita per le applicazioni App Engine. Offre la capacità della cache al meglio delle possibilità e è soggetta alla domanda complessiva di tutte le applicazioni App Engine che utilizzano il servizio memcache condiviso.

  • Memcache dedicata fornisce una capacità di cache fissa assegnata esclusivamente alla tua applicazione. È fatturato in base alle GB di dimensione della cache e richiede l'abilitazione della fatturazione. Avere controllo sulle dimensioni della cache significa che la tua app può avere prestazioni più prevedibili e con meno letture da uno spazio di archiviazione più costoso e durevole.

Entrambi i livelli di servizio memcache utilizzano la stessa API. Per configurare il servizio memcache per la tua applicazione, consulta la pagina relativa all'utilizzo di Memcache.

La tabella seguente riepiloga le differenze tra le due classi di servizio memcache:

Funzionalità Memcache dedicata Memcache condivisa
Prezzo 0,06 $ per GB all'ora Nessun costo
Capacità
us-central
Da 1 a 100 GB
altre regioni
Da 1 a 20 GB
Nessuna capacità garantita
Prestazioni Fino a 10.000 letture o 5.000 scritture (esclusive) al secondo per GB (elementi < 1 kB). Per maggiori dettagli, vedi Statistiche cache. Non garantita
Negozio duraturo No No
SLA Nessuno Nessuno

La fatturazione memcache dedicata viene addebitata in incrementi di 15 minuti. Se la valuta utilizzata per il pagamento è diversa da USD, si applicano i prezzi elencati nella tua valuta negli SKU di Cloud Platform.

Se la tua app richiede più capacità memcache, contatta il nostro team di vendita.

Limiti

All'uso del servizio memcache si applicano i limiti seguenti:

  • La dimensione massima di un valore dei dati memorizzati nella cache è 1 MB (10^6 byte).
  • Una chiave non può superare i 250 byte. Nel runtime Python, le chiavi composte da stringhe più lunghe di 250 byte verranno sottoposte ad hashing. (gli altri runtime si comportano in modo diverso).
  • Le operazioni batch "multi" possono avere un numero qualsiasi di elementi. Le dimensioni totali della chiamata e le dimensioni totali dei dati recuperati non devono superare i 32 megabyte.
  • Una chiave memcache non può contenere un byte nullo.

Come scadono i dati memorizzati nella cache

Memcache contiene le coppie chiave-valore. Le coppie in memoria cambiano in qualsiasi momento, man mano che gli elementi vengono scritti e recuperati dalla cache.

Per impostazione predefinita, i valori archiviati in memcache vengono conservati il più a lungo possibile. I valori possono essere eliminati dalla cache quando un nuovo valore viene aggiunto alla cache e la cache è in esaurimento. Quando i valori vengono rimossi a causa della pressione della memoria, i valori meno utilizzati vengono rimossi per primi.

L'app può indicare una scadenza quando viene archiviato un valore, espresso come numero di secondi in relazione all'aggiunta del valore o come tempo Unix assoluto in futuro (un numero di secondi a partire dalla mezzanotte del 1° gennaio 1970). Il valore viene rimosso non più tardi di questo periodo, anche se può essere rimosso in precedenza per altri motivi. L'aumento del valore memorizzato per una chiave esistente non aggiorna la data di scadenza.

In rari casi, i valori possono scomparire dalla cache prima della scadenza per motivi diversi dalla pressione della memoria. Sebbene memcache sia resiliente agli errori del server, i valori memcache non vengono salvati su disco, quindi un errore del servizio può causare la mancata disponibilità dei valori.

In generale, un'applicazione non deve aspettarsi che un valore memorizzato nella cache sia sempre disponibile.

Puoi cancellare l'intera cache di un'applicazione tramite l'API o nella sezione memcache di Google Cloud Console.

Statistiche cache

Operazioni al secondo per dimensione articolo

La memcache dedicata viene valutata in operazioni al secondo per GB, in cui un'operazione viene definita come accesso a un singolo elemento cache, ad esempio get, set o delete. La percentuale di operazioni varia in base alle dimensioni dell'articolo in base alla tabella riportata di seguito. Il superamento di queste valutazioni potrebbe causare una latenza maggiore dell'API o errori.

Le tabelle seguenti forniscono il numero massimo di operazioni esclusive, get-hit o set per GB di cache. Tieni presente che un'operazione get-hit è una chiamata get che rileva che esiste un valore archiviato con la chiave specificata e restituisce tale valore.

Dimensioni articolo (kB) Massimo get-hit operazioni/s Massimo set operazioni/s
≤1 10.000 5000
100 2000 1000
512 500 250

In teoria, un'app configurata per più GB di cache può raggiungere una percentuale di operazioni aggregate, calcolata come il numero di GB moltiplicato per la tariffa per GB. Ad esempio, un'app configurata per 5 GB di cache potrebbe raggiungere 50.000 operazioni memcache/sec su elementi da 1 KB. Il raggiungimento di questo livello richiede una buona distribuzione del carico attraverso lo spazio delle chiavi memcache.

Per ogni pattern IO, i limiti elencati sopra si riferiscono alle letture o alle scritture. Per le letture simultanee and, i limiti sono su una scala scorrevole. Più letture vengono eseguite, minore è il numero di scritture che possono essere effettuate e viceversa. Ciascuno dei seguenti è limiti di IOP di esempio per letture e scritture simultanee di 1 KB di valori per 1 GB di cache:

Lettura IOP Scrittura IOP
10000 0
8000 1000
5000 2500
1000 4500
0 5000

Unità di calcolo Memcache (MCU)

La velocità effettiva di Memcache può variare a seconda delle dimensioni dell'elemento a cui accedi e dell'operazione che vuoi eseguire sull'elemento. Puoi associare approssimativamente un costo alle operazioni e stimare la capacità di traffico che puoi aspettarti da memcache dedicata utilizzando un'unità denominata Memcache Compute Unit (MCU). La MCU è definita in modo tale che tu possa aspettarti 10.000 MCU al secondo per GB di memoria cache dedicata. La console Google Cloud mostra la quantità di MCU attualmente utilizzata dalla tua app.

Tieni presente che la MCU è una stima statistica approssimativa e non è un'unità lineare. Ogni operazione cache che legge o scrive un valore ha un costo MCU corrispondente che dipende dalla dimensione del valore. L'MCU di set dipende dalla dimensione del valore: è il doppio del costo di un'operazione get-hit riuscita.

Valore dell'elemento di valore (kB) Costo dell'MCU per get-hit Costo dell'MCU per set
≤1 1.0 2.0
2 1.3 2,6
10 1,7 3.4
100 5.0 10,0
512 20,0 40,0
1024 50,0 100,0

Le operazioni che non leggono o scrivono un valore hanno un costo MCU fisso:

Operazione MCU
get-miss 1.0
delete 2.0
increment 2.0
flush 100,0
stats 100,0

Tieni presente che un'operazione get-miss è un get che rileva che non è presente alcun valore memorizzato con la chiave specificata.

Confronta e imposta

Confronta e imposta è una funzionalità che consente di gestire più richieste contemporaneamente per aggiornare il valore della stessa chiave memcache in modo atomico, evitando così le condizioni della gara.

Componenti logici chiave di confronto e impostazione

Se stai aggiornando il valore di una chiave memcache che potrebbe ricevere altre richieste di scrittura simultanee, devi utilizzare l'oggetto memcache Client, che memorizza alcune informazioni sullo stato utilizzate dai metodi che supportano il confronto e l'impostazione. Non puoi utilizzare le funzioni memcache get() o set(), perché sono stateless. La classe Client non è sicura per il thread, pertanto non devi utilizzare lo stesso oggetto Client in più thread.

Quando recuperi le chiavi, devi usare i metodi Client memcache che supportano il confronto e l'impostazione: gets() o get_multi() con il parametro for_cas impostato su True.

Quando aggiorni una chiave, devi utilizzare i metodi memcache Client che supportano il confronto e l'impostazione: cas() o cas_multi().

L'altro componente logico chiave è il servizio memcache di App Engine e il relativo comportamento in merito al confronto e all'impostazione. Il servizio memcache di App Engine stesso funziona in modo atomico. In altre parole, quando due richieste in parallelo (per lo stesso ID app) utilizzano memcache, vengono inviate alla stessa istanza di servizio memcache e quest'ultimo ha un blocco interno sufficiente da consentire la serializzazione corretta delle richieste simultanee per la stessa chiave. In particolare, ciò significa che due richieste cas() per la stessa chiave non vengono eseguite in parallelo: il servizio gestisce la prima richiesta arrivata fino al completamento (ovvero aggiornando il valore e il timestamp) prima che inizi a gestire la seconda richiesta.

Per scoprire come utilizzare le funzionalità di confronto e impostazione in Python, leggi Gestire le operazioni di scrittura simultanee.

Best practice

Di seguito sono riportate alcune best practice per utilizzare memcache:

  • Gestisci con facilità gli errori dell'API memcache. Le operazioni di Memcached possono non riuscire per vari motivi. Le applicazioni dovrebbero essere progettate per rilevare le operazioni non riuscite senza esporre questi errori agli utenti finali. Queste istruzioni si applicano in particolare alle operazioni Imposta.

  • Utilizza la funzionalità di batch dell'API quando possibile, soprattutto per gli elementi di piccole dimensioni. Questo contribuisce ad aumentare le prestazioni e l'efficienza della tua app.

  • Distribuisci il carico nello spazio delle chiavi memcache. Avere un singolo o piccolo set di elementi memcache che rappresentano una quantità sproporzionata di traffico ostacola la scalabilità dell'app. Queste istruzioni si applicano sia alle operazioni/sec sia alla larghezza di banda. Spesso puoi risolvere questo problema partizionando esplicitamente i dati.

    Ad esempio, puoi suddividere un contatore aggiornato di frequente in più chiavi, leggerle nuovamente e sommarle solo quando è necessario un totale. Analogamente, potete dividere un dato di 500.000 dati che devono essere letti su ogni richiesta HTTP su più chiavi e leggerli utilizzando una singola chiamata API batch. Sarebbe meglio memorizzare il valore nella memoria dell'istanza. Per la memcache dedicata, il tasso di accesso di picco su una singola chiave dovrebbe essere 1-2 ordini di grandezza inferiore alla valutazione per GB.

Passaggi successivi