транзакционный 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"
Другие вопросы по тегам