2015-06-11 2 views
0

Документы на redis.io на RPUSH и LPUSH неясно, сохраняются ли эти операции O (1) или трансационные операции при нажатии нескольких элементов. Например, если два клиента выполняют RPUSH в том же списке с несколькими элементами, могут ли их элементы перемежаться и, следовательно, не соответствовать порядку? КомментарийМожет ли RPUSH и LPUSH участвовать в гонке Redis?

Тадман на его ответ очистил это вверх лучше для меня: Can RPUSH and LPUSH in Redis race?

ответ

3

С Redis однопоточный, нет такой вещи, как они происходят в «одновременно», один будет всегда приходит вперед из другие, хотя время часто не поддается контролю.

Теперь, если у вас есть два процесса, можно каким-то образом скоординировать, вы можете отложить их до другого, пока эта операция не будет завершена. Вы могли бы создать какой-то пессимистический замок, если бы вас это беспокоило, хотя это только одно решение.

Итак, короткий ответ: да, они прибудут в случайном порядке.

Именно поэтому Redis реализует команду MULTI для совершения транзакций. Эти транзакции будут применены атомарно.

+0

Таким образом, каждая команда будет поступать в случайном порядке, то есть вы не можете гарантировать, что RPUSH 'a' произойдет до RPUSH' b', но однопоточный дизайн Redis гарантирует, что элементы 'a' не перемежаются с элементами из 'b'? То есть, результаты являются либо 'ab', либо' ba', но не слиянием элементов 'a' и' b'? – sabrehagen

+1

Да, в принципе невозможно, чтобы две операции конфликтуют напрямую, но так работает большинство баз данных. Не забывайте, что вы можете использовать несколько элементов «RPUSH», и одна команда применяется атомарно, только несколько команд будут чередоваться и только если они не инкапсулированы в оператор 'MULTI'. – tadman

Смежные вопросы