Я хочу абстрагировать статистику, рассчитывая на объекты в моей системе, до одного места. В настоящий момент каждый объект увеличивает счетчик в своей строке в таблице MySQL, т. UPDATE sometable SET views = views + 1 WHERE id = ?
Чтобы получить значительное увеличение производительности вместо того, чтобы записывать это обновление в БД каждый раз, когда объект используется, я хотел бы использовать apc для хранения объекта singleton analytics в счетчиках наращивания памяти внутри этого объекта и периодически сохранять этот объект обратно в БД.
Однако я правильно понимаю, что если два человека посещают одну и ту же страницу и увеличивают объект статистики, возможно, что одно из представлений может быть потеряно, если оба они делают $obj->views = $obj->views + 1
потому что объект статистики из apc будет иметь одинаковое общее количество просмотров, они оба увеличивают один и впоследствии перезаписывают друг друга.
Как мне обойти это?
Если вы действуете в три этапа:
Тогда, да, у вас могут быть проблемы с параллелизмом.
Лучшим решением было бы иметь одну запись APC для каждого из ваших счетчиков; и используйте apc_inc()
чтобы apc_inc()
ее.
Вероятно, это означает, что у вас много записей (по одному на каждый счетчик), но это также означает, что в большинстве sitautions (при добавлении счетчиков, что будет сделано больше всего) вам не придется заботиться о параллелизме: APC будет справитесь с этим для вас.
Остается только проблема, когда вы захотите:
Там вы снова столкнетесь с проблемами параллелизма.
Два решения:
Как пара боковых, теперь:
Memcache::increment
Во втором случае вы можете переключиться на другое решение, которое: