zoukankan      html  css  js  c++  java
  • Redis消息通知

    Redis的消息通知通过列表类型实现,分为两种模式:阻塞式、发布/订阅式:

    阻塞式

    顾名思义,消息生产者负责生产消息,并将消息放到队列的一端,消息的消费者负责消费消息,从队列的另一端取出消息,然后对其进行消费,假如消息的生产者突然罢工了,或者消息的生产速度赶不上消费者的消费速度,那么消息的消费者会一直翘首以盼地阻塞在那里,直到达到指定的超时时间,或者消息队列中又有新的消息被它获取并进行消费。

    在Redis中提供给了我们命令BLPOP|BRPOP来进行阻塞式获取消息,且支持可以从多个队列中进行取数。

    消费者命令格式:BRPOP|BLPOP KEY [KEY...] TIMEOUT;从key、key1、key2...中获取消息,一次只获取一条,按照从左往右的顺序,只有当key没有消息的时候,才会从key1中获取消息,当key和key1中都没有消息的时候,才会从key2中获取消息。TIMEOUT指定超时时间,当阻塞时间达到TIMEOUT时(单位秒),会终止消息的获取。如果TIMEOUT=0,表示永远不会超时,会一直等待下去。

    返回结果

    等待超时:会返回两个值,第一个值是nil,表示没有获取到消息,第二个值是时间,表示等待了多久后超时。

    获取消息:获取消息会返回三个值,第一个值是列表的键,表示从哪个key中获得的消息,第二个值是获取的消息,第三个值是等待的时间。

    生产者命令格式:LPUSH|RPUSH key value [value...];很普通的对列表类型的数据添加数据的操作,返回结果是我们添加成功消息的数量。

    发布/订阅模式

    阻塞式解决了一对一的消息生产消费模式,但是在某些情况下,如发布加班通知消息的时候,我们需要有一对多的情况进行消费消息。

    订阅频道消息:SUBSCRIBE channel [channel...];订阅一个或多个频道。

    订阅频道后会进入订阅状态,在订阅状态中只能使用SUBSCRIBE(订阅频道)、UNSUBSCRIBE(取消订阅)、PSUBSCRIBE(按规则订阅)、PUNSUBSCRIBE(按规则取消)四个命令。

    返回结果

    订阅频道成功:返回值的个数等于频道数*3,第一个值是subscribe,表示订阅成功,第二个值是订阅成功的频道名称,第三个值是当前订阅的总频道数。如果一次订阅多个频道,对这三个值进行循环返回。

    接收频道消息:返回三个值,第一个值是message,表示返回的是消息,第二个值是频道名称,第三个值是消息内容。

    发布频道消息:PUBLISH channel message;向一个频道发布消息。返回结果是消息的订阅数量。

    按规则订阅频道消息:PSUBSCRIBE channel[pattern] [channel[pattern]...];按规则订阅消息

    返回结果

    订阅成功:返回值的个数等于频道数*3,第一个值是psubscribe,表示订阅成功,第二个值是订阅的频道规则,第三个是当前订阅的频道总数。

    注意:这里我们使用同样的频道规则进行订阅,它返回订阅的频道总数一直是1,不会重复累加。但是如果我们使用如channel*和ch*这样的规则,则会对能匹配上的频道进行重复订阅。

    接受消息:返回四个值,第一个值是pmessage,表示接收到的是消息,第二个值是channel*,表示我们的订阅规则,第三个值是频道名称,表示匹配上的频道全称,第四个值是消息内容。

  • 相关阅读:
    [leetcode-671-Second Minimum Node In a Binary Tree]
    [leetcode-667-Beautiful Arrangement II]
    棋盘从左上到右下最小初始值
    [leetcode-666-Path Sum IV]
    [leetcode-665-Non-decreasing Array]
    [leetcode-215-Kth Largest Element in an Array]
    LINQ简记(3):子句
    技巧篇:如何重写基类的事件
    技巧篇:结合反射技术实现多算法动态加密
    龙年新作:水印文字添加工具源码摘要
  • 原文地址:https://www.cnblogs.com/yxth/p/11512841.html
Copyright © 2011-2022 走看看