Redis应用-异步消息队列与延时队列

Redis应用-异步消息队列与延时队列

大家好,又见面了,我是全栈君。

异步消息队列

说道消息队列,你肯定会想到KafkaRabbitmq等消息中间件,这些专业的消息中间件提供了很多功能特性,当然他的部署使用维护都是比较麻烦的。如果你对消息队列没那么高要求,想要轻量级的,使用Redis就没错啦。

Redis通过list数据结构来实现消息队列.主要使用到如下命令:

  • lpush和rpush入队列

  • lpop和rpop出队列

  • blpop和brpop阻塞式出队列

Redis应用-异步消息队列与延时队列

废话补不多说上代码:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

//发送消息
$redis->lPush($list, $value);

//消费消息
while (true) {
    try {
        $msg = $redis->rPop($list);
        if (!$msg) {
            sleep(1);
        }
        //业务处理
     
    } catch (Exception $e) {
        echo $e->getMessage();
    }
}

上面代码会有个问题如果队列长时间是空的,那pop就不会不断的循环,这样会导致redis的QPS升高,影响性能。所以我们使用sleep来解决,当没有消息的时候阻塞一段时间。但其实这样还会带来另一个问题,就是sleep会导致消息的处理延迟增加。这个问题我们可以通过blpop/brpop 来阻塞读取队列。

blpop/brpop在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。消息的延迟几乎为零。用blpop/brpop替代前面的lpop/rpop,就完美解决了上面的问题。

还有一个需要注意的点是我们需要是用try/catch来进行异常捕获,如果一直阻塞在那里,Redis服务器一般会主动断开掉空链接,来减少闲置资源的占用。

Redis应用-异步消息队列与延时队列

延迟队列

你是否在做电商项目的时候会遇到如下场景:

  • 订单下单后超过一小时用户未支付,需要关闭订单

  • 订单的评论如果7天未评价,系统需要自动产生一条评论

这个时候我们就需要用到延时队列了,顾名思义就是需要延迟一段时间后执行。Redis可通过zset来实现。我们可以将有序集合的value设置为我们的消息任务,把value的score设置为消息的到期时间,然后轮询获取有序集合的中的到期消息进行处理。

实现代码如下:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$redis->zAdd($delayQueue,$tts, $value);

while(true) {
    try{
        $msg = $redis->zRangeByScore($delayQueue,0,time(),0,1);
        if($msg){
            continue;
        }
        //删除消息
        $ok = $redis.zrem($delayQueue,$msg);
        if($ok){
            //业务处理
        }
    } catch(\Exception $e) {

    }
}

这里又产生了一个问题,同一个任务可能会被多个进程取到之后再使用 zrem 进行争抢,那些没抢到的进程都是白取了一次任务,这是浪费。解决办法:将 zrangebyscorezrem使用lua脚本进行原子化操作,这样多个进程之间争抢任务时就不会出现这种浪费了。

Redis应用-异步消息队列与延时队列

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111601.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hadoop生态圈的理解「建议收藏」

    hadoop生态圈的理解「建议收藏」 hadoop部分:hadoop生态圈的理解(HDFS,MapReduce,HBASE,zookeeper,hive,sqoop,flume,kafka,yarn,spark) 一、简介       &am

    2022年5月22日
    25
  • 监督学习型神经网络

    监督学习型神经网络兄弟姐妹们,如需转载请标明出处:http://blog.csdn.net/jiangjunshow总目录什么是监督学习?简单的回答是:判断是否是监督学习,就看输入数据是否有标签。输入数据有标签,则为有监督学习,没标签则为无监督学习。对于上面的简单回答,如果你看不懂,是正常的!下面我给出详细回答,如果你还是不明白,那么…….也是正常的。因为有些概念要被接受是需要时间的!坚持不懈地看我

    2022年5月28日
    38
  • vmware虚拟机上安装win7系统_window10 虚拟机

    vmware虚拟机上安装win7系统_window10 虚拟机文章目录一、前言二、VMware下载三、XP系统镜像下载四、创建XP虚拟机一、前言最近需要搞windows系统兼容测试,根据数据显示,目前市面上占比TOP3的系统如下:排名系统占比1win7sp159.25%2win1029.83%3xpsp38.87%4其他–没想到2021年了,xp系统还占了8.87%。我自己本机是win10,不想安装双系统,决定弄个xp虚拟机好了。在网上下载了一个xp的iso镜像文件,使用虚拟机加载却提示:

    2022年8月16日
    28
  • fedora13_奔驰系统可以升级到最新吗

    fedora13_奔驰系统可以升级到最新吗
    Fedora14于11月2号正式发布了,而我的Fedora12已经用了1年多了,尽管仍然十分稳定,但还是想着赶赶潮流。
     
    完全重装当然是舍不得的,于是Google了一下,发现了preupgrade这个Tool可以用来升级系统,详情参见:http://fedoraproject.org/wiki/PreUpgrade。
     
    升级还是很傻瓜话的,惟一的问题就是由于我家网络不太好,下载升级包的过程中找不到mirror而终端过一次。重新开始之后,正好是凌晨5

    2022年9月20日
    3
  • LSTM 08:超详细LSTM调参指南

    LSTM 08:超详细LSTM调参指南本文讨论了如何调整LSTM超参数。

    2022年7月19日
    41
  • php arcsin函数,excel如何计算反三角函数

    excel如何计算反三角函数Excel中计算反三角函数需要用到反余弦函数(ACOS)、反正弦函数(ASIN)和反正切函数(ATAN)。函数ACOS是用来计算指定数值的反余弦值的,公式为:=ACOS(number)。函数ASIN是用来计算指定数值的反正弦值的,公式为:=ASIN(number)。函数ATAN是用来计算指定数值的反正切值的,公式为:=ATAN(number)。反余弦函数的使用1、反余弦…

    2022年4月8日
    260

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号