zoukankan      html  css  js  c++  java
  • 【数据库开发】Redis消息通知

    消息通知


    任务队列


    使用任务队列的好处
    • 松耦合。生产者和消费者无需知道彼此的实现细节,只需要约定好任务的描述格式。这使得生产者和消费者可以由不同的团队使用不同的编程语言编写
    • 易于扩展。消费者可以有多个,而且可以分布在不同的服务器中, 借此可以轻易地降低单台服务器的负载

    使用LPUSH和RPOP命令实现队列, 这里介绍一个新命令BRPOP和BLPOP BRPOP key [key ...] timeout(s) BRPOP命令和RPOP命令相似,唯一的区别是当列表中没有元素时BRPOP命令会一直阻塞住连接,直到有新元素加入

    优先级队列

    利用BRPOP命令可以检测多个key的功能。如果多个键都有元素,则按照从左到右顺序取第一个键中的一个元素。因此,要实现优先级队列,把优先级高的key放到前面就ok了。

    发布/订阅 模式
    • "发布/订阅"模式中包含两种角色,分别是发布者和订阅者。
    • 订阅者可以订阅一个或若干个频道(channel)
    • 发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息。
    命令 描述
    PUBLISH channel msg 发布消息. 接收到这条消息的订阅者数量. 发出去的消息不会被持久化,也就是说当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的就收不到了
    SUBSCRIBE channel [channel ...] 订阅频道,可以同时订阅多个频道
    UNSUBSCRIBE [channel ...] 取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道
    PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道
    PUNSUBSCRIBE [pattern [pattern ...]] 退订指定的规则, 如果没有参数则会退订所有规则
    PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态

    注意

    • 执行SUBSCRIBE命令后客户端会进入订阅状态,处于此状态下客户端不能使用除SUBSCRIBE/UNSUBSCRIBE/PSUBSCRIBE/PUNSUBSCRIBE这4个属于“发布/订阅”模式的命令之外的命令,否则会报错
    • 使用PUNSUBSCRIBE命令只能退订通过PSUBSCRIBE命令订阅的规则,不会影响直接通过SUBSCRIBE命令订阅的频道;同样UNSUBSCRIBE命令也不会影响通过PSUBSCRIBE命令订阅的规则。另外容易出错的一点是使用PUNSUBSCRIBE命令退订某个规则时不会将其中的通配符展开,而是进行严格的字符串匹配,所以PUNSUBSCRIBE无法退订channel.规则,而是必须使用PUNSUBSCRIBE channel.*才能退订

    进入订阅状态后客户端可能收到三种类型的回复。 每种类型的回复都包含3个值,

    消息类型(第一个值) 第二个值 第三个值
    subscribe:表示订阅成功的反馈信息 订阅成功的频道名称 当前客户端订阅的频道数量
    message:表示接收到的消息 产生消息的频道名称 消息的内容
    unsubscribe:表示成功取消订阅某个频道 对应的频道名称 当前客户端订阅的频道数量

    第一个值为unsubscribe, 当第三个值为0时客户端会退出订阅状态,之后就可以执行其他非“发布/订阅”模式的命令了

    示例:

    redis A>SUBSCRIBE channel.1
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "channel.1"
    3) (integer) 1
    # PSUBSCRIBE 按规则订阅
    redis C>PSUBSCRIBE channel.?*
    Reading messages... (press Ctrl-C to quit)
    1) "psubscribe"
    2) "channel.?*"
    3) (integer) 1
    
    redis B>PUBLISH channel.1 hi!
    (integer) 2
    
    #此时,C接收到回复
    1) "pmessage"
    2) "channel.?*" # 注意回复多了一个值,第二个值为订阅时使用的通配符
    3) "channel.1"
    4) "hi!"

    规则channel.?*可以匹配channel.1和channel.10,但不会匹配channel.。

  • 相关阅读:
    装饰
    统一软件开发过程之2:用例文本书写
    统一软件开发过程之1:创建领域模型
    工厂方法
    volatile
    中介者
    建造者
    C#委托,事件与回调函数
    控件资源嵌入
    装饰
  • 原文地址:https://www.cnblogs.com/huty/p/8517414.html
Copyright © 2011-2022 走看看