PHP/REDIS 实现消息队列服务

Redis键失效通知实现电商订单自动取消方案 Redis键空间通知(Keyspace Notifications)是Redis提供的一种事件通知机制,当键被删除、过期或修改时会触发相应事件。其核心原理是通过PUB/SUB模式发布事件消息,客户端可以订阅特定通道获取实时通知。这种机制在延迟任务触发场景中具有显著技术价值,相比传统轮询方案能实现毫秒级响应且资源消耗更低。典型的应用场景包括电商订单自动取消、优惠券过期处理等时效性要求高的业务。本文以PHP实现为例,详细解析如何利用Redis键过期事件构建高可靠的订单自动取消系统,涵盖从环境配置、核心代码到生产 阅读详情

普通消息队列

producer(生产者)

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

// 生成任务
$tasks = [];
for ($i = 0; $i < 3; $i++) {
    $tasks[] = $i;
}

// 投递任务给消费者
$res = $redis->lPush("tasks", ...$tasks);

consumer(消费者)

$redis = new Redis();

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

// 思考问题: 空轮询不但拉高了客户端的 CPU,redis 的 QPS 也会被拉高
// 空轮询是什么?
// 就是无论列表里面是否存在数据那么都一直不停执行 pop

while (true) {
    // blpop/brpop 阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。
    // 消息的延迟几乎为零。用blpop/brpop替代前面的lpop/rpop,就完美解决了上面的问题
    $res = $redis->brPop("tasks", 20);
    if (!$res) {
        // 未取到数据
        // sleep(1);
        // sleep 用上面睡眠的办法可以解决问题。但是有个小问题,那就是睡眠会导致消息的延迟增大。
        // 如果只有 1 个消费者,那么这个延迟就是 1s。
        // 解决方案: 如果有多个消费者,这个延迟会有所下降,因为每个消费者的睡觉时间是岔开来的
        continue;
    } else {
        // 进行消费
        echo "消费成功" . PHP_EOL;
        sleep(1); // 模拟耗时业务
    }
}

延时队列消息

producer(生产者)

// 消费者客户端
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);


// 生成任务
$tasks = [];
for ($i = 0; $i < 50; $i++) {
    array_push($tasks, time() + $i);
    array_push($tasks, str_shuffle('asdfghjklqwertyuiopzxcvbnm1234567890'));
}

// Redis Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中
// 投递任务
$res = $redis->zAdd('delay-queue', [], ...$tasks);

if ($res) {
    echo 'success' . PHP_EOL;
} else {
    echo 'fail: zadd error' . PHP_EOL;
}

consumer(消费者)

$redis = new Redis();

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

$key = 'delay-queue';

while (true) {
    // Redis Zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列
    $msg = $redis->zRangeByScore($key, 0, time(), ['limit' => [0, 1]]);
    if (count($msg) > 0) {
        // Redis Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略
        $success = $redis->zRem($key, $msg[0]);
        // 如果是多个客户端进行消费,多线程多进程争抢任务的关键。
        // 它的返回值决定了当前实例有没有抢到任务,因为 loop 方法可能会被多个线程、多个进程调用。
        // 同一个任务可能会被多个进程线程抢到,通过 zrem 来决定唯一的属主。
        if ($success) {
            echo "消费成功: {$msg[0]}" . PHP_EOL;
            sleep(1);// 模拟耗时业务
        } else {
            echo "消费失败" . PHP_EOL;
        }
    } else {
        // 无消息 休息一秒 防止客户端CUP飙升 降低 redis 的QPS数
        sleep(1);
    }
}
phpredis提高消息队列的实时性方法(推荐) 数据库存贮都用list形式 要存2个队列 1个用作消息队列保存到数据 还有个 就是用来实时读取数据在redis $redis->lpush($queenkey, json_encode($array)); $redis->lpush($listkey, json_encode($array)); /*消息队列实例*/ public function insertinfo() { $infos = array('info1' => mt_rand(10,100), 'info2' => mt_rand(10,100)); $this->insertinfos($ 立即下载

相关推荐

Nginx下ModSecurity模块安装详细教程

本文提供了在Nginx 1.28.0上安装ModSecurity v3的完整教程。首先需安装编译依赖,然后从源码编译安装ModSecurity库并设置优化参数。接着编译Nginx动态模块并配置加载。核心配置包括设置规则引擎、日志路径及性能优化参数。安装OWASP核心规则集后,在Nginx站点配置中启用ModSecurity。最后测试规则有效性并给出性能优化建议,如规则排除、精简规则集等。整个过程包含详细的命令和配置示例,确保安全防护功能正常运作。

深山技术宅的博客 1781

redis实现轮询算法_实现一个简单的轮询算法

前言负载均衡,大家应该听的也不少了,也实践过N次了。当然也会知道,负载均衡是有不少算法的:随机,轮询,加权轮询,最少连接。。。。本文重点说的是轮询。先举个例子看看轮询算法是如何运作的。假设我们的API站点有3台负载(10.0.10.1,10.0.10.2和10.0.10.3),客户端第一次请求API的时候,会访问.1拿到结果,第二次会访问.2拿到结果,第三次则会访问.3拿到结果,后面就是依次类推。...

weixin_32111725的博客 2647

基于boot + 双app升级方案

基于boot+双app的升级方案

weixin_44654285的博客 4514

PHP使用 Redis 实现消息队列

新创建两个文件,push和pop文件redis 1. push.php 推送shell //这里经过URL直接传递参数进行 keyword $keyword = $_GET['keyword']; $redis = new Redis(); $redis->connect('127.0.0.1',6379); try{ echo $redis->LPUSH('list',' '.$keyword); }catch(Exception $e){ echo $e->getMessage(

诗与远方_ 1983

别再乱选保护板了!手把手教你用ABLIC S-8254A为3/4串锂电池组DIY安全保护电路

本文详细介绍了如何使用ABLIC S-8254A保护集成电路为3/4串锂电池组DIY安全保护电路。从选型策略、电路搭建到功能验证,手把手教你实现可靠的充放电保护系统,适用于无人机、电动工具等场景,确保锂电池组的安全使用。

weixin_42525264的博客 187

Sentinel2 哨兵2数据下载方法(USGS)-史上最全讲解

本文讲述了从USGS官网下载Sentinel2的方法。主要包括USGS官网的注册和下载流程,以及选定研究区中所出现的问题、解决办法。

xiatiandexia123的博客 6万+

mysql主动通知redis_Redis消息通知系统的实现

最近忙着用Redis实现一个消息通知系统,今天大概总结了一下技术细节,其中演示代码如果没有特殊说明,使用的都是PhpRedis扩展来实现的。 内存 比如要推送一条全局消息,如果真的给所有用户都推送一遍的话,那么会占用很大的内存,实际上不管粘性有多高的产品最近忙着用Redis实现一个消息通知系统,今天大概总结了一下技术细节,其中演示代码如果没有特殊说明,使用的都是PhpRedis扩展来实现的。内存比...

weixin_32676541的博客 421

超临界二氧化碳再热再压缩布雷顿循环建模与先进控制

超临界二氧化碳布雷顿循环建模与先进控制研究 本文研究了超临界二氧化碳再热再压缩布雷顿循环系统的建模与控制。通过MATLAB/Simscape构建了包含压缩机、透平、回热器等关键组件的动态模型,并设计了基于模型预测控制(MPC)和自抗扰控制(ADRC)的多层控制策略。系统采用转速控制的压缩机、阀门开度控制的透平,以及可变热源加热器,实现了全动态分析。研究结果表明,MPC与ADRC混合控制方案相较于传统PID控制,功率超调降低至0.9%,效率波动控制在±0.08%,扰动恢复时间缩短至12秒。

AI的内部世界的博客 340

php redis消息队列

不专业的点赞消息队列 前端传来点赞作品的id,作品的分类(普通作品,动态),用户名userName redis队列里存的格式为 userNmae=>id 脚本运行addlike_time,将队列数据取出,存入mysql,mysql用了pdo,乐观锁(写的不是很专业)。 addlike_time文件用到了mypdo类 mypdo.php <?php # 基于PDO的二次封装 # ...

weixin_43873024的博客 174

Oracle数据库表空间使用情况查询

在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对象的逻辑存储单元。了解表空间的使用情况对于数据库管理员和开发人员来说是非常重要的,因为它可以帮助他们监控数据库的空间使用情况并进行容量规划。本文将介绍如何查询Oracle数据库中的表空间使用情况。通过执行以上SQL查询语句,你可以获得Oracle数据库中表空间的使用情况、文件大小和表空间大小等信息。这些信息可以帮助你了解数据库的存储情况,并进行适当的优化和容量规划。查看表空间的数据文件和表空间大小。查看表空间的使用情况。

CsmbPascal的博客 857

QNX侧触摸屏(TP)Bringup流程与源码深度解析

QNX侧TP Bringup的核心在于构建。

QQ_778132974的博客 477

2017-5-5/PHP实现负载均衡的加权轮询

1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。 随机法:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。 源地址哈希法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。...

weixin_30291791的博客 254

QT5.12.1报错:1. clang++:error: :fatal error andriod Input/output error

QT5.12.1报错:1. clang++:error: :fatal error andriod Input/output error 解决方式: 1.qt程序不要放在共享目录下编译,直接拷贝到ubuntu系统中编译 2.修改/home/xt/Qt5.12.1/5.12.1/android_armv7/mkspecs/android-clang中 #QMAKE_LINK = QMAKECXXQMAKE_CXX QMAKEC​XXQMAKE_CFLAGS -Wl,–exclude-libs,libgc

xt18971492243的博客 735

php nodejs 前台,GitHub - webzh/PHP-push-to-NodeJs: 简单的nodeJS websocket链接,并利用redis中间层,实现PHP后端推送消息到前台。...

PHP-push-to-NodeJs利用redis消息队列作为中间件,实现多语言之间的消息实时推送。本项目演示的为php推送实时消息至网页前端,利用php推送数据至redis,nodeJS实时接收,并与网页客户端建立websocket通讯,保障消息实时传递。简单的nodeJS websocket链接,并利用redis中间层,实现PHP后端推送消息到前台。安装要求1, php + redis 扩展2...

weixin_33915387的博客 224

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【构建高性能微服务架构】:PHP与Python异步通信的3种高效实现方案

掌握PHP-Python的异步通信,提升微服务性能。本文详解基于消息队列、gRPC和REST API的3种高效实现方案,适用于高并发、跨语言系统集成场景,实现解耦与高效协作。方法实用,架构灵活,值得收藏。

SimTrans的博客 814

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

揭秘协作传感 API 数据延迟:如何用 PHP 缓存机制实现毫秒级响应

解决协作传感 API 数据延迟难题,详解PHP缓存机制实现毫秒级响应。通过内存缓存与请求合并优化,提升高并发场景下数据读取效率。掌握协作传感 API 的 PHP 缓存策略,构建高效稳定的应用系统,值得收藏。

LogicPlex的博客 941

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Enqueue RPC调用完全指南:实现分布式服务通信

Enqueue是PHP生态中功能强大的消息队列解决方案,支持分布式系统中的RPC(远程过程调用)通信模式。本文将详细介绍如何使用Enqueue Client组件实现高效、可靠的RPC调用,帮助开发者轻松构建跨服务通信的分布式应用。 ## 什么是RPC调用? RPC(Remote Procedure Call,远程过程调用)是一种允许程序调用另一个地址空间(通常是远程服务器)上的过程或函数的通信

gitblog_00110的博客 790

仅限本周!PHP实现设备指令秒级响应的6种黑科技方法首次披露

掌握PHP智能家居设备控制接口开发的高效秘诀,实现指令秒级响应。涵盖异步处理、消息队列、长连接等6种核心技术,适用于家庭自动化、远程控制等场景,提升系统稳定性和响应速度。方法实用高效,值得收藏。

PixelGlow的博客 889

Twake核心架构深度剖析:PHP后端与TypeScript前端的完美融合

Twake作为一个开源协作平台,其核心架构采用了PHP后端与TypeScript前端的创新融合设计,为团队协作提供了高效、安全的解决方案。在前100个字内,我们深入探讨Twake如何通过这种架构组合实现企业级生产力工具的完美平衡。 ## 🏗️ Twake架构全景图:微服务协同设计 Twake采用现代化的微服务架构,将复杂的功能模块分解为独立的服务单元。这种设计不仅提升了系统的可维护性,还确保

gitblog_00082的博客 758

PHP与Python进程间通信完全攻略(资源共享架构设计精髓)

掌握PHP与Python进程间通信的高效方案,详解PHP-Python的资源共享实现机制。涵盖REST API、消息队列、共享存储等适用场景与核心方法,提升系统协同效率。架构设计精髓总结,值得收藏。

Instrustar的博客 394

PHP文件上传实现完全指南(从基础到高并发处理)

掌握PHP文件上传实现的完整方案,解决开发中常见的安全与性能问题。涵盖表单处理、类型验证、分片上传及高并发优化策略,适用于图片、大文件等场景。从基础到进阶,提升项目稳定性与用户体验,值得收藏。

ProceGlow的博客 867

【农业物联网后端架构升级】:基于PHP的分布式数据聚合方案全公开

解决农业物联网数据分散难题,本文深入解析基于PHP的分布式数据聚合服务实现方案。适用于温室监控、智能灌溉等场景,通过消息队列与微服务架构提升处理效率与系统稳定性。全面公开技术架构与优化策略,值得收藏。

FastProceed的博客 591

基于PHP 搭建高并发分布式集群系统思路

做了很多有关php 项目,其中包括(P2P、电商、配送、CRM、OA以及银行智能风控系统解决方案)。我想对自己的工作成果经验总结一下,同时也算是一次升华。 项目中经常提到大流量和高并发的名词,听起来很让人害怕,无从下手,其实我们应该从实际的业务场景来规划应该如果去解决这些问题,正常情况下我们系统应该只是某个或者某几个服务压力非常大,其他业务负载不会太高,下面我从整体的架构来记录下思路,至于具体的实施方案,我在后续的文章会慢慢记录下来。 高并发大流量的系统架构应该是从单体架构到服务拆分逐渐演变而来,并不是

gyk163的博客 4808

百万级PHP网站架构工具箱

在了解过世界最大的PHP站点,Facebook的后台技术后,今天我们来了解一个百万级PHP站点的网站架构:Poppen.de。Poppen.de是德国的一个社交网站,相对Facebook、Flickr来说是一个很小的网站,但它有一个很好的架构,融合了很多技术,如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsu

hyb1234hi的专栏 431

nodejs+php+vue毕业生学历证明系统演

Hbuilderx;Flask 是一个轻量级的 Web 框架,使用 Python 语言编写,较其他同类型框架更为灵活、轻便且容易上手,小型团队在短时间内就可以完成功能丰富的中小型网站或 Web 服务的实现。8、AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。

QQ_188083800的博客 144

如何使用PHP和Redis实现消息队列功能?

其实PHP和Redis实现消息队列的功能,使用的是Redis的List这种数据结构。使用rPush入列、blPop出列,实现队列的先进先出(FIFO)。也可以使用lPush入列、blPop出列,来实现队列的先进后出(FILO)。实现PHP和Redis消息队列的功能,其实就以下三个步骤。1、安装Redis。2、安装PHP的Redis扩展。3、编写生产者、消费者代码进行测试验证。上面的代码只是做个简单的示例,如果运用到实际的项目当中需要做进一步的优化。

zhangbin1988的专栏 3526
上一篇: GitHub Desktop was unable to store the account token in the keychain.
下一篇: Laravel homestead 安装 PHP 扩展
backender
博客等级 码龄12年 4粉丝 26原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值