Этот вопрос о лучших практиках в архитектуре.
Наша текущая архитектура
У меня есть класс PHP, который обращается к MySQL для получения информации о пользователе. Давайте назовем это User
. User
Доступ осуществляется много раз, поэтому мы реализовали слои кэширования для уменьшения нагрузки.
Первый уровень - это то, что мы называем кешем «на запрос». После того, как данные были получены из MySQL, мы храним данные в частной собственности User
. Любые последующие запросы данных возвращают свойство вместо повторного запроса данных из MySQL.
Поскольку веб-запрос живет и умирает для каждого отдельного запроса, этот кеш не позволяет приложению обращаться к MySQL более одного раза за один запрос.
Наш второй слой - Memcached. Когда приватное свойство пусто, мы сначала проверяем Memcached на данные. Если Memcached пуст, мы запрашиваем данные в MySQL, обновляем Memcached и обновляем приватное свойство User
.
Вопрос
Наше приложение - игра, и иногда обязательно, чтобы некоторые данные были как можно более актуальными. В течение примерно пяти минут запрос на чтение пользовательских данных может происходить 10 или 11 раз; тогда может произойти обновление. Последующие запросы на чтение должны быть обновлены, иначе игровая механика потерпит неудачу.
Итак, мы сделали фрагмент кода, который выполняется, когда происходит обновление базы данных. Этот код устанавливает ключ в Memcached с обновленными данными, поэтому все последующие запросы к Memcached являются актуальными.
Это оптимально? Есть ли какие-то проблемы с производительностью или другие "ошибки", о которых мы должны знать, пытаясь поддерживать своего рода "живой кэш", подобный этому?