Найти - Пользователи
Полная версия: shared object for processes via memcached
Начало » Django » shared object for processes via memcached
1 2
LestatCheb
с лок файлами тоже не хотелось бы сделать, таких разных статистик уже 6 штук, и возможно будут увеличиваться :)
впрочем тоже решение, да.

хм, я тут подумал, тут еще один глюк может быть:
2 процесса одновременно забирают объект статистики из memcached, и одновременно его обновляют на +1.
в итоге статистика обновится всего лишь на +1, а не на +2.
Ed
LestatCheb
хм, я тут подумал, тут еще один глюк может быть:
2 процесса одновременно забирают объект статистики из memcached, и одновременно его обновляют на +1.
в итоге статистика обновится всего лишь на +1, а не на +2.
Насколько я помню у memcache есть atomic increment. Вы разве не его пользуете?
LestatCheb
Ed
LestatCheb
хм, я тут подумал, тут еще один глюк может быть:
2 процесса одновременно забирают объект статистики из memcached, и одновременно его обновляют на +1.
в итоге статистика обновится всего лишь на +1, а не на +2.
Насколько я помню у memcache есть atomic increment. Вы разве не его пользуете?
мм.. а atomic increment только для чисел ведь,
а у меня в memcached питоновский объект с параметрами shows и clicks.
я могу конечно переделать на числа, скажем bstat_id_555_clicks и bstat_id_555_shows и делать им инкремент.
но это будет ли правильным? а если у объекта было бы 100 параметров, то держать 100 чисел в memcached?
или скажем нужно было не число менять, а список или текст изменять.

извините если задаю глупые вопросы :(
просто хочется разобраться как такие вещи решаются.
Андрей Светлов
Не хотите atomic increment - вспомните, что memcache держит compare and swap
Ed
LestatCheb
мм.. а atomic increment только для чисел ведь,
а у меня в memcached питоновский объект с параметрами shows и clicks.
я могу конечно переделать на числа, скажем bstat_id_555_clicks и bstat_id_555_shows и делать им инкремент.
но это будет ли правильным? а если у объекта было бы 100 параметров, то держать 100 чисел в memcached?
или скажем нужно было не число менять, а список или текст изменять.
Для объектов на одном хосте я бы попользовал http://docs.djangoproject.com/en/dev/topics/cache/#local-memory-caching
Там есть локи. Либо расширил бы memcached бэкэнд, добавив туда работу с вызовом cas (Compare and swap).

Да, то, что вы объекты там держите - это хорошо, но нужно понимать, что memcached - это key-value store, то есть ваши объекты сереализуются перед попаданием туда и десереализуются после доставания оттуда. Тут atomic-ом и не пахнет. Чудес не бывает.
LestatCheb
хм, нашел на просторах интернета такую вещь http://jbq.caraldi.com/2010/08/simple-distributed-lock-with-memcached.html
сейчас проверил, вроде работает, думаю остановиться пока на ней.
Ed
Поосторожнее там с expiration time, иначе если процесс, поставивший лок, умрет, то остальные будут ждать эти 60000 секунд пока ключ не заэкспайрится.
LestatCheb
Ed
Поосторожнее там с expiration time, иначе если процесс, поставивший лок, умрет, то остальные будут ждать эти 60000 секунд пока ключ не заэкспайрится.
хм, и правда, тогда уменьшу это значение.

вообще там лок по идее идет не больше секунды.

спасибо!
LestatCheb
все-таки на рабочем сервере не прокатило, слишком медленно,
переделал сбор статистики на асинхронные задания в Celery и все полетело :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB