Как синхронизировать доступ к ehcache, memcached & amp; другие магазины значения ключа?

StackOverflow https://stackoverflow.com/questions/1436483

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top