2017-01-20 7 views
1

Мне нужен идентификатор целых чисел постоянства для операции, называемой примерно 100 раз в секунду. У меня есть один документ в коллекции настроек, где id хранится в поле lastId.Последовательность в монго - может положиться на findAndModify()?

В соответствии с mongodb doc Я хочу реализовать его с помощью findAnyModify() с параметром update: { $inc: { lastId: 1 } }. Могу ли я полагаться на то, что каждый следующий вызов возвращает новый (увеличенный) номер?

Или лучше в качестве обходного пути использовать java AtomicLong счетчик? Он будет читать lastId от mongo в начале, и на каждом приращении я буду писать (но не читать) из mongo?

ответ

1

Если вам нужна постоянная последовательность в mongodb, вам действительно нужно использовать оператор $inc, чтобы атомизировать на стороне сервера заданное поле, которое вы будете использовать в качестве счетчика.

Если вы используете AtomicLong, вы вряд ли сможете гарантировать согласованность вашей последовательности (особенно в среде кластера), чтобы вы могли столкнуться с ситуациями, когда в конечном итоге вы получаете один и тот же идентификатор для нескольких документов.

+1

Спасибо за разъяснение! – awfun