专栏首页星辰日记利用Redis实现消息队列

利用Redis实现消息队列

什么是消息队列

消息队列(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(); 
        $rhis->redis->connect('127.0.0.1', 6379); //连接Redis
    } 
    
    public function push($str){
        $this->redis->lpush(self::$key,$str); //从队尾入队
    }

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

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

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

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


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • EasySwoole中利用redis实现消息队列

    本文为北溟有鱼QAQ原创文章,转载无需和我联系,但请注明来自北溟有鱼QAQ https://www.umdzz.cn ...

    北溟有鱼QAQ
  • redis实现消息队列

    消息队列一般都会想到kafka,rabbitmq,Rockermq, 其实,给你印像做缓存的Redis也是能做消息队列.

    星痕
  • Redis实现消息队列 转

    打开浏览器,输入地址,按下回车,打开了页面。于是一个HTTP请求(request)就由客户端发送到服务器,服务器处理请求,返回响应(response)内容。

    wuweixiang
  • Redis实现简单消息队列

    打开浏览器,输入地址,按下回车,打开了页面。于是一个HTTP请求(request)就由客户端发送到服务器,服务器处理请求,返回响应(response)内容。

    周小董
  • [记录点滴]Redis实现简单消息队列

    本文提出了一种用Redis实现简单消息队列的方案,适合在资源不足的条件下临时使用。

    罗西的思考
  • 消息队列(一) MySQL实现消息队列

    消息队列(一)MySQL实现消息队列 (原创内容,转载请注明来源,谢谢) 一、概述 消息队列(MessageQueue,通常简称MQ)是一种进程间通信或同一进...

    用户1327360
  • redis消息队列

    对于 单队列,单进程的queue, 是满足先入先出的特点的,本身是有序的,但是如果有多个队列或多个消费者线程的时候,可能会产生乱序的问题。

    changan
  • Redis和消息队列使用实战

    静儿
  • 使用Node.js驱动Redis,实现一个消息队列!

    Peter谭金杰
  • php+redis实现消息队列功能示例

    本文实例讲述了php+redis实现消息队列功能。分享给大家供大家参考,具体如下:

    砸漏
  • Redis实现消息队列的4种方案

    Redis作为内存中的数据结构存储,常用作数据库、缓存和消息代理。它支持数据结构,如 字符串,散列,列表,集合,带有范围查询的排序集(sorted sets),...

    allsmallpig
  • Spring Boot使用Redis消息队列

    十毛
  • Python使用redis的消息队列

    Criss@陈磊
  • 基于Redis实现分布式消息队列(一)

    1、为什么需要消息队列? 当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。

    后端技术探索
  • 基于Redis实现分布式消息队列(二)

    1、访问Redis的工具类 public class RedisManager {

    后端技术探索
  • [视频教程] 基于redis的消息队列实现与思考

    使用redis的list列表来实现消息队列功能,相信大家都听过消息队列,但是在业务中可能并没有真正去使用它。在公司项目中正好有个场景使用到了消息队列,因此就来说...

    陶士涵
  • php基于Redis消息队列实现的消息推送的办法

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持网站事(zalou.cn)。

    砸漏
  • php基于Redis消息队列实现的消息推送的方法

    砸漏
  • C#调用RabbitMQ实现消息队列

    我在刚接触使用中间件的时候,发现,中间件的使用并不是最难的,反而是中间件的下载,安装,配置才是最难的。

    Kiba518

扫码关注云+社区

领取腾讯云代金券