Esta pregunta es sobre las mejores prácticas en arquitectura.
Nuestra arquitectura actual
Tengo una clase de PHP que accede a MySQL para obtener información del usuario. Llamémoslo User
. Se accede a User
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". Una vez que los datos se han recuperado 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 en función de cada solicitud, este caché solo impide 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 en ocasiones es imperativo que algunos datos estén lo más actualizados posible. En el lapso de unos cinco minutos, una solicitud de lectura de 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 falla.
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 algún problema de rendimiento u otros "errores" que debamos tener en cuenta al intentar mantener una especie de "caché viviente" como este?