Questa domanda riguarda le migliori pratiche in architettura.
La nostra architettura attuale
Ho una classe PHP che accede a MySQL per informazioni sull'utente. Chiamiamolo User
. User
si accede più volte, quindi abbiamo implementato livelli di cache per ridurre il carico.
Il primo livello è ciò che chiamiamo cache "per richiesta". Dopo che i dati sono stati recuperati da MySQL, archiviamo i dati in una proprietà privata di User
. Eventuali richieste successive per i dati restituiscono la proprietà invece di richiedere nuovamente i dati da MySQL.
Poiché la richiesta Web è attiva e muore in base alla richiesta, questa cache impedisce all'applicazione di accedere a MySQL più di una volta in una singola richiesta.
Il nostro secondo livello è Memcached. Quando la proprietà privata è vuota, controlliamo prima Memcached per i dati. Se Memcached è vuoto, interroghiamo MySQL per i dati, aggiorniamo Memcached e aggiorniamo la proprietà privata di User
.
La domanda
La nostra applicazione è un gioco e talvolta è indispensabile che alcuni dati siano il più aggiornati possibile. Nell'arco di circa cinque minuti, una richiesta di lettura per i dati dell'utente può avvenire 10 o 11 volte; quindi potrebbe verificarsi un aggiornamento. Le successive richieste di lettura devono essere aggiornate o la meccanica di gioco fallisce.
Quindi, ciò che abbiamo fatto è implementare un pezzo di codice che viene eseguito quando si verifica un aggiornamento del database. Questo codice imposta la chiave in Memcached con i dati aggiornati, quindi tutte le successive richieste a Memcached sono aggiornate.
È ottimale? Ci sono problemi di prestazioni o altri "problemi" di cui dovremmo essere a conoscenza quando cerchiamo di mantenere una sorta di "cache vivente" come questa?