吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1560|回复: 4
收起左侧

[其他原创] [PHP]利用Redis实现消息队列

[复制链接]
58172309 发表于 2021-8-29 13:14
本帖最后由 58172309 于 2021-8-30 01:32 编辑

什么是消息队列

消息队列(message queue) 可以分为两部分,即消息(message)与队列(queue),它是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:

  1. 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。   
  2. 消息队列主要解决了应用耦合、异步处理、流量削锋等问题。   

当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。

遇到的场景

在这里我遇到的场景是: 对于同步发信(点击按钮时立即发信)可能会造成响应过慢或同一时间请求量过大导致的QPS限制,为此我尝试用PHP+Redis设计了一个消息队列服务.

开始实现

消息队列的本质和队列结构类似,均为先进先出(FIFO),这里利用到的是redis的List(列表).利用lpush进行入队,然后通过rpop出队.

class Mq{
    public static $key = 'mq'; //Redis键名称
    function __construct(){
        $this->redis = new Redis(); 
        $this->redis->connect('127.0.0.1', 6379); //连接Redis
    } 

    public function push($str){
        $this->redis->lpush(self::$key,$str); //从队尾入队
    }

    public function push($str){
        $data = $this->redis->rpop(self::$key); //从队首出队并处理
        print_r($data);
        /* code */
    }
}

至此我们让Mq类中的push方法循环运行,便实现了一个最简单的消息队列服务,但是在实际过程中可能会遇到一些问题,比如循环运行push方法导致的负载高,对于这个问题,我们可以用brpop来缓解。

    public function push($str){
        while($data = $this->redis->brpop(self::$key),3600){ //从队首出队并处理
            print_r($data);
            /* code */
        }
    }

这里的3600代表超时时间,如果队列中一直没有数据,便会阻塞3600秒,当然我们也可以把这个值设置成0来无限阻塞,但是我们又遇到了一个问题,长时间的阻塞导致Redis自动断开了连接,这里可以试着在redis连接后使用$redis->setOption(3, -1);来将Redis的连接时间设置成永不超时.

免费评分

参与人数 1吾爱币 +5 热心值 +1 收起 理由
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

  • · Aarow|主题: 991, 订阅: 304

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

edward333 发表于 2021-8-29 13:38
厉害,虽然说传统主流用kafka,但是这个思路拿来学习redis也挺新颖
skyfox 发表于 2021-8-29 16:05
塞北的雪 发表于 2021-8-29 16:18
LZ有个地方没说,这个只适合CLI模式,网页模式一会儿就超时终止了
 楼主| 58172309 发表于 2021-8-29 16:20
塞北的雪 发表于 2021-8-29 16:18
LZ有个地方没说,这个只适合CLI模式,网页模式一会儿就超时终止了

对的,服务端一般都以cli模式运行
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-3 20:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表