Im интересно, что является лучшим способом сделать мой Memcache операций atmoic в моем веб-приложении.PHP Atomic Memcache
Рассмотрим следующий сценарий во внимание:
Client 1 connects and retrieves data from key 1
Client 2 connects a few microsecond after Client 1, requests the same data from key 1
Client 1 saves new data to key 1
Client 2 saves new (different data) to key 1, not taking into account that Client 1 modified the value already
В этом случае нет атомарность в этом процессе.
Мое (потенциальное) решение состоит в том, чтобы устанавливать, приобретать и выпускать блокировки ключей из моего приложения.
Так вышеописанный процесс будет работать, как это после моей реализации:
Client 1 connects, checks for an active lock on key 1, finds none, and gets the data
Client 2 connects a few microsecond after Client 1, requests the same data from key 1, but finds a lock
Client 2 enters a retry loop until Client 1 releases the lock
Client 1 saves new data to key 1, releases the lock
Client 2 gets the fresh data, sets a lock on key 1, and continues
Мысли? Будет ли этот метод работать, и будут ли какие-либо успехи в производительности, о которых я должен опасаться?
К сожалению, модификации не будут такими же простыми, как приращение на 1. В случае, когда кредиты добавляются или вычитаются из переменных сумм, мне нужно абсолютное атомарность в этом процессе. Второй вариант похож на мое (потенциальное) решение. – Kovo
Лучшим решением является 'cas()'. Второе лучшее решение - использовать два ключа: '$ keyname' и' $ keyname.'_ lock''. Используйте 'add()/delete()' для получения/освобождения блокировки. –