memcache: проблема совместного доступа к данным

php memcache

есть данные, доступ к которым должен осуществлять строго поочерёдно (подсчёт статистики).
данные пишутся в память (с помощью memcache). скрипт может получить эти данные и как-то изменить. и проблем нет, пока доступ проиходит строго друг за другом. но если запускаются 2 скрипта, получается такая беда:
- запускается скрипт №1
- получение данных скриптом №1
- изменение данных скриптом №1
- запуск скрипта №2
- получение данных скриптом №2
- запись изменённых данных скриптом №1
- изменение данных скриптом №2
- запись изменённых данных скриптом №2
в итоге, содержимое кеша будет неверным (т. к. потеряются изменения, сделанные первым скриптом).

в случае, если данные хранить в файле, можно сделать так:
while ( ! flock($lock_file, LOCK_EX | LOCK_NB)) {
# какие-то действия, если долго нельзя получить блокировку
}
т. е. пока первый скрипт не освободит блокировку, второй не сможет продолжить работу.
в случае хранения данных в бд тоже можно извернуться с помощью блокировки таблицы.

а как же быть, если данные хранятся в оперативной памяти?
собственно, интересуют ВАШИ соображения на эту тему.

Примечание:
да я думал и о бд, и о файлах...
но файлы всё-таки медленно. в mysql есть замечательные (с виду) таблицы memory, но:
1. я с ними не работал;
2. они используют записи фиксированной длины (text/blob недопустимы). сколько будут "весить" данные, не знаю (но знаю, что они будут точно увеличиваться).
в голову приходят только извращения, основанные на блокировке фиктивных файлов /таблиц в бд.
есть методы memcache increment/decrement, но с их помощью всё-равно нельзя гарантировать, что параллельный поток не вклинится:
while ($memcache_obj->get('test_item')) {
# здесь могут сработать второй/третий потоки и тоже увеличить значение 'test_item'
$memcache_obj->increment('test_item');
# код
}
общую область памяти для нескольких скриптов (для формирования очереди) сделать вроде как нельзя.

Примечание:
о, чётко!
спасибо большое
Ответы:
Возможно, в данной ситуации более правильным будет использование БД.
Данные бывают либо быстрые, либо большие. И то и другое - маловероятно. Поэтому общий принцип такой: храните быстрые данные в memcache или memory MySQL, а большие - в обычных таблицах MySQL или же (очень большие) - в файлах.


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

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

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.