Esta pregunta es sobre las mejores prácticas en arquitectura.
Nuestra arquitectura actual
Tengo una clase PHP que accede a MySQL para obtener información del usuario. Digamos que es User
. User
se accede muchas veces, por lo que hemos implementado capas de almacenamiento en caché para reducir la carga.
La primera capa es lo que llamamos el caché "por solicitud". Después de recuperar los datos de MySQL, almacenamos los datos en una propiedad privada de User
. Cualquier solicitud posterior de los datos devuelve la propiedad en lugar de volver a solicitar los datos de MySQL.
Dado que la solicitud web vive y muere por solicitud, este caché solo evita que la aplicación acceda a MySQL más de una vez en una sola solicitud.
Nuestra segunda capa es Memcached. Cuando la propiedad privada está vacía, primero verificamos los datos en Memcached. Si Memcached está vacío, consultamos los datos de MySQL, actualizamos Memcached y actualizamos la propiedad privada de User
.
La pregunta
Nuestra aplicación es un juego, y a veces es imperativo que algunos datos estén lo más actualizados posible. En el lapso de aproximadamente cinco minutos, una solicitud de lectura para los datos del usuario puede ocurrir 10 u 11 veces; entonces puede ocurrir una actualización. Las solicitudes de lectura posteriores deben estar actualizadas o la mecánica del juego fallará.
Entonces, lo que hemos hecho es implementar un fragmento de código que se ejecuta cuando ocurre una actualización de la base de datos. Este código establece la clave en Memcached con los datos actualizados, por lo que todas las solicitudes posteriores a Memcached están actualizadas.
¿Es esto óptimo? ¿Hay alguna inquietud de rendimiento u otras "trampas" que deberíamos tener en cuenta al tratar de mantener una especie de "caché viva" como esta?