Обновление memcached записи
В настоящее время я разрабатываю систему, оптимизированную для чтения. Архитектура представляет собой MySQL как авторитетное постоянное хранилище и слой memcache между MySQL db и клиентами. Время от времени записи происходят, но гораздо реже, чем чтения.
БД работает на относительно слабом хосте, поэтому у меня есть стимул минимизировать доступ к БД. Текущий протокол в моей голове выглядит так:
[Записи DB и memcache связаны с последовательностями версий для оптимистической блокировки]
- Во время загрузки выделенный процесс загружает все текущие записи из базы данных в memcache.
- Когда происходит запись, она будет:
- а. загрузить версию записи из memcache (версия memcache).
- б. в транзакции базы данных попробуйте обновить базу данных, если (версия записи в базе данных <загруженная версия memcache + 1), версия записи в базе данных будет обновлена до (версия memcache + 1) в случае успеха.
- с. если b преуспел, продолжайте обновлять memcache с новой записью и версией = (версия memcache + 1)
- Между тем, выделенный процесс периодически загружает все данные из базы данных и помещает их в memcache, на случай, если некоторые записи не будут переданы в memcache. Может привести к некоторому состоянию гонки здесь с 2, но я считаю, что это приемлемо.
Мое текущее предположение состоит в том, что для записи в любое время (версия memcache) <= (версия db), и, следовательно, множественные одновременные записи из 2 не вызывают состояние гонки.
Может ли кто-нибудь найти какие-либо проблемы из этого дизайна? Спасибо!