【问题标题】:transactional pubsub in Redis with python redis client使用 python redis 客户端在 Redis 中的事务性 pubsub
【发布时间】:2022-01-05 01:46:46
【问题描述】:

我知道 Redis 有事务和发布/订阅的概念。我想知道您是否可以使用 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 中做到这一点??

【问题讨论】:

    标签: redis py-redis


    【解决方案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()
    

    如果您通过 MONITOR 命令在 redis-cli 中对其进行监控,则会将以下消息发送到 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"
    

    【讨论】:

    • 你能告诉我如何用 pubsub 写一个 redis 管道吗?
    • 答案中添加的示例
    • 我的印象是你只能在 redis.pubsub() 创建的 pubsub 对象上调用 publish 方法。这不是真的吗?您能否评论一下答案中 pubsub 对象和管道对象之间的区别?谢谢!
    • 您只能使用 pubsub 对象来订阅。发布可以与常规 redis 连接或管道一起使用。 PUBLISH 是一个“常规”Redis 命令,不像 SUBSCRIBE 将连接置于只有有限命令集可用的状态。请参阅此处的示例:github.com/redis/redis-py#publish--subscribe 请注意,subscribe() 和 get_message() 是 pubsub 对象 p 的方法,而 publish() 是“常规”Redis 连接 r。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2012-06-06
    • 2015-09-29
    • 1970-01-01
    • 2019-04-24
    • 2018-06-19
    • 1970-01-01
    相关资源
    最近更新 更多