Как синхронизировать доступ к ehcache, memcached и другим хранилищам значений ключей? - PullRequest
4 голосов
/ 17 сентября 2009

Насколько я понимаю, каждый из этих методов: get() и put() являются атомарными.

Но при доступе к кешам, таким как ehcache & memcached, CheckThenAct, возникают условия гонки.

Что мы должны синхронизировать, чтобы гарантировать, что если thread1 выполняет Get(), а thread2 выполняет Get(), а затем Put(), то первый Get() получит новое значение, добавленное thread2?

Ответы [ 2 ]

3 голосов
/ 17 сентября 2009

Способ справиться с подобной ситуацией состоит в том, чтобы не кэшировать записи из нескольких мест или контролировать доступ каким-либо другим способом.

Простое решение этой проблемы - не делать никаких записей в кеш от ваших клиентов. Вместо этого, если вы хотите обновить значение, вы запускаете запрос на обновление значения. Если это значение получено откуда-то еще, это может работать хорошо. Если он рассчитывается или иным образом исходит от клиента, это может быть более проблематично.

Общий компонент для использования с memcache & mdash; по крайней мере, в мире PHP & mdash; является beanstalkd как процессор распределенной рабочей очереди. В этом сценарии вы можете отключить запрос «обновление кэша» как единицу работы.

Если вы выполняете операцию над записью в кеше, которая использует существующее значение в качестве входных данных, или каким-либо другим способом вводите условие гонки, если get-then-update не была атомарной операцией, альтернативой является создание единица работы, которая включает в себя старое значение и новое значение. Таким образом, любой процесс, обрабатывающий обновления, может сделать недействительным или иным образом обработать те ситуации, когда текущее значение не является ожидаемым.

Инкремент и декремент обрабатываются интерфейсом memcached, поэтому, если ваши обращения имеют такой тип (или могут быть сокращены до такого рода операций), то это также решает проблему.

1 голос
/ 12 октября 2011

Для memcached вы можете использовать операцию cas () для проверки перед выполнением put (), что другая операция не обновила данные.

...