В общем, имеется счетчик количества комментариев у статьи, для ускорения работы, было принято решение кэшировать часть данных в Redis. Само приложение использует socket.io. Причем оно будет работать на нескольких серверах.
Для хранения счетчика количества комментариев в Redis была выбран hashmap. При каждом добавлении / удалении комментария в транзакции производится действие(INSERT,DELETE) и UPDATE на поле счетчика, оттуда сразу получается текущее значение счетчика, и кладется в редис через HSET. Сделано было так, а не через increment / decrement, так как нода может упасть, и значение не обновится. А так без разницы, не этот запрос, так следующий поправить количество. Но, тут возникла основная проблема, так как ноды могут быть на разных серверах, что создает задержку может быть попытка перезаписи нового значения "старым".
То есть:
Сервер 1:
- инкремент значения поля в MySQL и получение значения
- -
- -
- Сохранения значения в Redis (по факту, тут и происходит перезапись нового значения старым)
Сервер 2:
- -
- инкремент значения поля в MySQL и получение значения
- Сохранения значения в Redis
- -
Цифрами обозначен порядок действий. Как можно предотвратить такую ситуацию, на ум только приходит идея с timestamp, но он тоже не может быть уникальным...?