Redis гарантирует возвращаемое значение XREAD?
Можно ли использовать XREAD (или, возможно, другую команду) для атомарного определения, были ли данные записаны в поток Redis?
Более конкретно:
Предположим, вы добавили некоторые данные в поток Redis в одном процессе и увидели, что данные были успешно добавлены с помощью некоторого автоматически сгенерированного ключа.
XADD somestream foo bar
После завершения этого XADD вы немедленно запускаете следующее чтение в другом процессе.
XREAD COUNT 1000 STREAMS somestream 0-0
Гарантированно ли этот XREAD возвращает данные? В документации неясно, гарантирует ли успешное выполнение XADD, что читатели сразу же увидят добавленные данные, или может возникнуть небольшая задержка.
1 ответ
Знаменитая однопоточная архитектура Redis отвечает на этот вопрос. Когда вы выполняетеXADD
на одном процессе (на стороне клиента) и после другого процесса (на стороне клиента) выполняется XREAD
затем сервер выполняет их последовательно, что гарантирует, что данные будут там до XREAD
выполняется.
Следующие цитаты взяты из книги Little Redis.
Каждая команда Redis атомарна, в том числе и те, которые выполняют несколько задач. Кроме того, Redis поддерживает транзакции при использовании нескольких команд.
Возможно, вы этого не знаете, но Redis на самом деле однопоточный, поэтому каждая команда гарантированно атомарна. Пока выполняется одна команда, другие команды выполняться не будут. (Мы кратко поговорим о масштабировании в следующей главе.) Это особенно полезно, если учесть, что некоторые команды выполняют несколько функций.