memcached блокировки

neko

tеam neko
memcached блокировки

лежит там небольшая табличка
есть много клиентов которые ее постоянно читают
есть несколько клиентов которые ее правят, по принципу:

1. get полностью
2. изменить полученный массив
3. set полностью

хотелось бы избежать гонок между модифицирующими клиентами, т.е. сделать так, чтобы пока это процедура происходит на одном из них, остальные бы подождали в сторонке

сделал пока что так: перед get, добавляю новый ключ, а после set его убираю. если ключ добавить не получилось, ждем....

собственно вопрос, народ как такие вещи делает?
 

AnToXa

prodigy-одаренный ребенок
в существующем memcache как я понимаю это вообще никак не делается.

это ведь все-таки просто кэш.

видится 3 выхода
1. дописать memcache
2. данные хранить в базе и собсна юзать memcache по прямому назначению.
3. чистить memcache полностью, там вроде есть flush или что-то такое после того как твой скрипт забрал данные, ну а потом уже заливать обратно.
 

fisher

накатила суть
>>бы избежать гонок между модифицирующими клиентами
это будет уже не кэш. мемкэш не гарантирует таких вещей и потому быстрый. пусть приложение (DML-ops) работает с базой, а getters цепляют кэш. таким образом
2 - наверное единственный правильный подход
1 - нетривиально + тормоза. но Путь Достойных! :)
3 - а flush от одного клиента блокирует set от другого клиента?
 

neko

tеam neko
да получается так, что я от него многовато хочу

что касает flush
он же вообще весь кеш сбросит какой на сервере есть
это неподходит
и потом непонятно, как это связанно с блокировками
 

neko

tеam neko
тони, ты уже начал отмечать? ;-)

-~{}~ 23.02.05 14:58:

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

почему-то мне казалось, что все кто этой вещью пользуется
начинают всеже с увеличения кол-ва серверов
 

tony2001

TeaM PHPClub
>тони, ты уже начал отмечать?
а что, надо? я могу.

вообще, семафоры - это стандартное средство для таких вещей imo.

Semaphores may be used to provide exclusive access to resources on the current machine, or to limit the number of processes that may simultaneously use a resource.
 

AnToXa

prodigy-одаренный ребенок
Автор оригинала: fisher
>
1 - нетривиально + тормоза. но Путь Достойных! :)
ну мы тут только этим и занимаемся, такие все достойные, аж жуть :)

3 - а flush от одного клиента блокирует set от другого клиента?
хммм, не очень понимаю что ты имеешь в виду под "блокирует".
но, зная, что memcached обрабатывает все комманды последовательно, race conditions тут уж возникать никак не должно.

-~{}~ 23.02.05 18:27:

вообще в существующей архитектуре memcache сделать блокировки на отдельные записи или группы записей вообще ОЧЕНЬ нетривиально.

для этого надо как минимум параллелить обработку запросов внутри memcache или очень аккуратно делать state machine с возможностью сохранения контекста и отката части или всего запроса.
 
Сверху