php使用redis消息队列swoole,EasySwoole中利用redis实现消息队列
什么是队列?
从数据结构上来讲,队列是一种先进先出的数据结构
什么是消息队列?
消息队列可以简单理解为:把要传输的数据放在队列中
消息队列可以分为生产者和消费者,将传输的数据放到消息队列当中,就相当于生产者,从消息队列中取得数据,就相当于消费者
消息队列可以用来做什么?
电商的秒杀,可以防止超卖
爬虫,将数据存入队列,利用多进程消费
解耦,A系统中的数据放入队列,B和C以及D系统去获取数据
异步限流,提升用户体验,防止系统崩溃
消息队列有哪些?
常见的有redis、kafka,mqtt、以及各种MQ,当然各有各的优缺点
消息队列中最大的问题是什么?
那就是数据的丢失,数据如果没有做落地,那么数据一旦丢失,将无法找回
Easyswoole中如何实现消息队列
首先easyswoole提供了通用的队列驱动器,可以使用任何一种队列来进行封装使用,这里以默认的redis为例
composer 安装 composer require easyswoole/queue
定义一个队列
namespace App\Utility;
use EasySwoole\Component\Singleton;
use EasySwoole\Queue\Queue;
class RedisQueue extends Queue
{
use Singleton;
}
定义消费进程
namespace App\Process;
use App\Utility\RedisQueue;
use EasySwoole\Component\Process\AbstractProcess;
use EasySwoole\Queue\Job;
class QueueProcess extends AbstractProcess
{
protected function run($arg)
{
// TODO: Implement run() method.
go(function (){
RedisQueue::getInstance()->consumer()->listen(function (Job $job){
var_dump($job->toArray());
});
});
}
}
注册驱动以及投递任务
//在EasySwooleEvent.php 里面注册驱动
public static function mainServerCreate(EventRegister $register)
{
// TODO: Implement mainServerCreate() method.
//注册redis驱动队列
$redisData = Config::getInstance()->getConf('REDIS');
$redisConfig = new RedisConfig($redisData);
$redis = new RedisPool($redisConfig);
$driver = new \EasySwoole\Queue\Driver\Redis($redis);
RedisQueue::getInstance($driver);
//注册消费进程
ServerManager::getInstance()->addProcess(new QueueProcess());
$register->add($register::onWorkerStart,function ($ser,$id){
if($id == 0){
Timer::getInstance()->loop(3000,function (){
//自动投递任务
$job = new Job();
$job->setJobData(['time' => time()]);
RedisQueue::getInstance()->producer()->push($job);
});
}
});
}
手动或者业务中投递任务
public function index()
{
$job = new Job();
$job->setJobData(['test'=>'测试','time'=>time()]);
var_dump(RedisQueue::getInstance()->producer()->push($job));
}
运行 php easyswoole start 即可看到效果实现或者手动请求index方法进行手动任务的投递
php使用redis消息队列swoole,EasySwoole中利用redis实现消息队列相关推荐
- android开发 app消息提醒功能,Android中利用App实现消息推送机制的代码
1.消息推送机制 服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭. 我想到了一句话:don't call me,i will call you! qq今 ...
- c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务
作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...
- PHP中利用redis实现消息队列处理高并发请求思路详解
在电商活动中,常常会出现高并发的情况,例如很多人同时点击购买按钮,以至于购买人数超出了库存量,这是一种非常不理想的状况,因此,我们在PHP开发中就会引入消息队列来解决这种高并发的问题. 当用户点击按钮 ...
- php redis 查询,Redis慢查询日志 PHP中使用redis – 安装扩展模块
Redis慢查询日志 编辑配置文件/etc/redis.conf 针对慢查询日志,可以设置两个参数,一个是执行时长,单位是微秒,另一个是慢查询日志的长度.当一个新的命令被写入日志时,最老的一条会从命令 ...
- 在 Java 中利用 redis 实现 LBS 服务
前言 LBS(基于位置的服务) 服务是现在移动互联网中比较常用的功能.例如外卖服务中常用的我附近的店铺的功能,通常是以用户当前的位置坐标为基础,查询一定距离范围类的店铺,按照距离远近进行倒序排序. 自 ...
- linux连接redis 命令_在Docker中使用Redis
1. 简介 本文章将介绍如何使用 Docker 探索 Redis.我们可以在 Docker for Windows .Docker for mac 或者 Linux 模式下运行 Docker 命令. ...
- java lbs_在 Java 中利用 redis 实现 LBS 服务
前言 LBS(基于位置的服务) 服务是现在移动互联网中比较常用的功能.例如外卖服务中常用的我附近的店铺的功能,通常是以用户当前的位置坐标为基础,查询一定距离范围类的店铺,按照距离远近进行倒序排序. 自 ...
- Redis安装以及在Idea中使用Redis初尝试
本文主要完成两方面的内容,一是 安装Redis服务端及验证:二是在Idea中链接Redis,并且编写程序初步使用Redis 1:安装Redis服务端及验证(win10-64位) Redis是一个开源 ...
- 【Java项目中 利用Redis实现数据缓存】
文章目录 Java SpringBoot项目中 用Redis实现数据缓存 1 环境搭建 1.1 maven坐标 1.2 配置文件 1.3 配置类 2 实现缓存短信验证码 3 缓存菜品数据 4 Spri ...
最新文章
- 为什么yamlp中没有cplex_在《英雄联盟》中,为什么有些T1英雄并没有我们想象中那么强势?...
- NumericUpDown 控件输入限制小数位
- 有关identity的小技巧
- 基于GIS的视频管理指挥平台
- 执行单元测试 报TEST class 有不能识别字符
- Linux服务部署之NTP时间服务器
- memmove 对同一个指针不操作
- 《软件项目管理(第二版)》第 9 章——项目监督与控制 重点部分总结
- linux 环境下git的安装与配置
- MySQL:常用备份方式(基于5.7)
- 统计自然语言处理(第二版)学习笔记:第一章
- jquery tableExport 插件导出excel (无乱码) 比较简单的表格
- 记一次too many open files 异常
- 运筹学基础:第2章-线性规划建模(习题笔记)
- 硬盘突然变raw格式_硬盘变成RAW格式怎么办
- 红外线 电磁波频谱
- Xilinx 7系列FPGA之Kintex-7产品简介
- 入职第一个CRUD项目小结
- 半同步/半反应堆线程池实现
- Hive安装过程中出现 The reference to entity createDatabaseIfNotExist must end with the ';' delimiter.问题