基于workerman的redis-queue实现异步邮件队列

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 实验场景:页面被客户访问发送邮件通知到我的邮箱,该场景只是为了测试,下单发送邮件或者短信的场景都是一样的,为了体现出来队列的优越性,我自己封装了个邮件发送的接口,接口内部实现增加了sleep(5),纯粹是为了给接口增加耗时,更好的达标实验效果。

实验场景:页面被客户访问发送邮件通知到我的邮箱,该场景只是为了测试,下单发送邮件或者短信的场景都是一样的,为了体现出来队列的优越性,我自己封装了个邮件发送的接口,接口内部实现增加了sleep(5),纯粹是为了给接口增加耗时,更好的达标实验效果。


workerman的redis-queue地址:


https://github.com/walkor/redis-queue


自己封装的邮件发送接口地址:


http://phpmailer.wlphp.com/sendmail_api.php?html=%E5%86%85%E5%AE%B9&recipient=613154514@qq.com&subject=%E7%89%B9%E5%88%AB%E6%8F%90%E7%A4%BA


如果在页面里面直接调用发送邮件接口的话,页面需要等待5秒才能加载出来。代码实现如下


        //直接调用, 在接口方故意模拟sleep( 5 ), 下面就会等5秒,上面就不用等直接扔给队列执行

        $html  =  '被访问了下' . date (  'Y-m-d H:i:s'  );

        $apiurl  =  'http://phpmailer.wlphp.com/sendmail_api.php?html=' . urlencode (  $html  ) . '&recipient=613154514@qq.com&subject=workerman的redis消息队列消息' ;

        echo   file_get_contents (  $apiurl  );

消息队列实现:该页面在是thinkphp5的mvc框架里面首先在核心函数库放入如下函数:


//有时候一些项目运行在apache或者php-fpm环境,无法使用workerman/redis-queue项目,可以参考如下函数实现发送

function   redis_queue_send ( $redis ,  $queue ,  $data ,  $delay  =  0 ) {

    $queue_waiting  =  'redis-queue-waiting' ;

    $queue_delay  =  'redis-queue-delayed' ;

    $now  =  time ();

    $package_str  =  json_encode ([

        'id'        =>  rand (),

        'time'      =>  $now ,

        'delay'     =>  0 ,

        'attempts'  =>  0 ,

        'queue'     =>  $queue ,

        'data'      =>  $data

   ]);

    if  ( $delay ) {

        return   $redis -> zAdd ( $queue_delay ,  $now  +  $delay ,  $package_str );

   }

    return   $redis -> lPush ( $queue_waiting . $queue ,  $package_str );

}

在页面控制器对应方法里面调用这个函数把要发送邮件信息添加到消息队列里面实现代码如下:


        //基于redis的消息队列服务

        $html  =  '被访问了下' . date (  'Y-m-d H:i:s'  );

        $redis  =  new  \ Redis ;

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

        $queue  =  'user-1' ;

        $data  = [ date (  'Y-m-d H:i:s'  ),  $html ];

        redis_queue_send (  $redis ,  $queue ,  $data  );

mvc框架里面只需要把消息仍进队列,不管邮件是否发送成功,所以不会造成阻塞,页面加载速度基本不受影响。


页面多刷新几次然后打开redis能够看见如下队列:


3.jpg

启动基于wokerman的消费者端:注意生产者在mvc框架里面,随时把消息添加到队列。消费者端基于cli命令行方式启动。

php  index.php  start

启动之后如下:消息被依次消费发送邮件


4.jpg

<?php

require __DIR__ . '/vendor/autoload.php';


use Workerman\Worker;

use Workerman\Lib\Timer;

use Workerman\RedisQueue\Client;


$worker = new Worker();

$worker->onWorkerStart = function () {undefined

   $client = new Client('redis://127.0.0.1:6379');

   $client->subscribe('user-1', function($data){undefined

       echo "user-1\n";

       var_export($data);

 //调用发送邮件接口

 $html=$data[1];

 $apiurl="http://phpmailer.wlphp.com/sendmail_api.php?html=".urlencode($html)."&recipient=613154514@qq.com&subject=workerman的redis消息队列消息";

 echo file_get_contents($apiurl);

   });

};


Worker::runAll();


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
缓存 NoSQL 数据库
探秘Redis读写策略:CacheAside、读写穿透、异步写入
本文介绍了 Redis 的三种高可用性读写模式:CacheAside、Read/Write Through 和 Write Behind Caching。CacheAside 简单易用,但可能引发数据不一致;Read/Write Through 保证数据一致性,但性能可能受限于数据库;Write Behind Caching 提高写入性能,但有数据丢失风险。开发者应根据业务需求选择合适模式。
808 2
探秘Redis读写策略:CacheAside、读写穿透、异步写入
|
7月前
|
消息中间件 NoSQL Java
别再用 Redis List 实现消息队列了,Stream 专为队列而生
别再用 Redis List 实现消息队列了,Stream 专为队列而生
149 0
|
3月前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
4月前
|
编解码 NoSQL Java
使用Spring Boot + Redis 队列实现视频文件上传及FFmpeg转码的技术分享
【8月更文挑战第30天】在当前的互联网应用中,视频内容的处理与分发已成为不可或缺的一部分。对于视频平台而言,高效、稳定地处理用户上传的视频文件,并对其进行转码以适应不同设备的播放需求,是提升用户体验的关键。本文将围绕使用Spring Boot结合Redis队列技术来实现视频文件上传及FFmpeg转码的过程,分享一系列技术干货。
252 3
|
1月前
|
设计模式 NoSQL Go
Redis 实现高效任务队列:异步队列与延迟队列详解
本文介绍了如何使用 Redis 实现异步队列和延迟队列。通过 Go 语言的 `github.com/go-redis/redis` 客户端,详细讲解了 Redis 客户端的初始化、异步队列的实现和测试、以及延迟队列的实现和测试。文章从基础连接开始,逐步构建了完整的队列系统,帮助读者更好地理解和应用这些概念,提升系统的响应速度和性能。
52 6
|
2月前
|
消息中间件 存储 NoSQL
如何用Redis实现延迟队列?
综上所述,通过Redis的有序集合和一些基本命令,我们可以轻松地构建出功能完善的延迟队列系统。根据具体需求,可以进一步优化和扩展,以满足高性能和高可靠性的业务需求。
63 1
|
3月前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
5月前
|
安全 NoSQL Java
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R
|
7月前
|
存储 缓存 NoSQL
node实战——koa给邮件发送验证码并缓存到redis服务(node后端储备知识)
node实战——koa给邮件发送验证码并缓存到redis服务(node后端储备知识)
96 0
|
7月前
|
监控 NoSQL 测试技术
python使用Flask,Redis和Celery的异步任务
python使用Flask,Redis和Celery的异步任务