транзакционный pubsub в Redis с клиентом python redis
Я знаю, что в Redis есть концепция транзакций и pub/sub. Мне интересно, можете ли вы сделать транзакционный pubsub с клиентом Python redis.
Вот установка. У меня есть два клиента A и B, которые нажимают на одни и те же два канала. Каждый раз каждый клиент может передавать свое имя в оба канала. Они могут решить сделать это одновременно (или в достаточно похожее время). Я хочу, чтобы каналы выглядели как [A,B][A,B] или [B,A] [B,A], но не [A,B] [B,A]. т.е. мне нужно, чтобы клиент атомарно публиковал данные в двух каналах.
В Redis cli я бы написал что-то вроде MULTI, PUBLISH FIRST A, PUBLISH SECOND A, EXEC.
Как это сделать в Python??
1 ответ
MULTI/EXEC: реализованы как часть класса Pipeline. Конвейер оборачивается операторами MULTI и EXEC по умолчанию, когда он выполняется, что можно отключить, указав transaction=False.
https://github.com/redis/redis-py#pipelines
Вот пример:
import redis
r = redis.Redis()
pipe=r.pipeline()
pipe.publish('A1','msg1')
pipe.publish('A2','msg2')
pipe.execute()
Если вы будете отслеживать его в redis-cli с помощью команды MONITOR, в Redis будут отправлены следующие сообщения:
1641318120.640290 [0 [::1]:53268] "MULTI"
1641318120.640346 [0 [::1]:53268] "PUBLISH" "A1" "msg1"
1641318120.640362 [0 [::1]:53268] "PUBLISH" "A2" "msg2"
1641318120.640371 [0 [::1]:53268] "EXEC"