当前位置:网站首页>php+redis实现超时取消订单功能
php+redis实现超时取消订单功能
2022-07-06 11:11:00 【Student Li】
业务场景:秒杀案例
秒杀业务逻辑:多个用户同时抢单,通过mysql行锁抢到的用户进入待支付页面(倒计时)。当用户没有支付订单超时时则取消该订单并归还库存。
应用
thinkphp+redis+workerman(可以自定义命令常驻)
1、thinkphp安装workerman。这里就过了,thinkphp手册去找。
2、安装好redis及扩展。用宝塔的直接搞就完了,过。
3、生产者:用户创建订单向redis插入一条订单数据。
$redis = new \Redis();
$redis->connect('127.0.0.1',6379);
//$redis->auth('密码');//redis有密码就加
/**
*seckill_time为列队名称
*time() + $seckill['pay_time']为到期时间戳
*$newSeckillOrder->id为订单id,可以json字符串存储
*/
$redis->zAdd('seckill_time', time() + $seckill['pay_time'], $newSeckillOrder->id);
4、消费者:这里我们需要一个常驻内存一直来查询这个列队是否有消息,如果有就消费掉。
workerman
/**
* 每个进程启动
* @param $worker
*/
public function onWorkerStart($worker)
{
//防止时间出问题
date_default_timezone_set('PRC');
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//redis密码
//$redis->auth('密码');//redis有密码就加此句
if($worker->id === 0){
//其他任务
}
//秒杀处理进程
if($worker->id === 1){
echo "启动秒杀任务!\n";
//workerman定时器,每秒执行一次。
Timer::add(1, function() use($redis) {
//通过zRangeByScore查询seckill_time列队中0到当前时间戳的数据。
$res = $redis->zRangeByScore('seckill_time', 0, time());
//存在数据
if (count($res) > 0) {
foreach ($res as $k=>$v){
//处理订单,$res[$k]为生产者存的订单id或数据。
//.....
//消费掉列队中的行数据
$redis->zRem('seckill_time', $res[$k]);
}
//这步不用说都懂的吧!毕竟常驻内存,我们要管理好内存哦~
unset($res);
}
});
}
}
测试结果:
我这边是延迟20秒消费
如下:
消费掉后列队就空了哦~
使用该方案的原因:
可能有些人会问,workerman有定时器,可以直接延迟操作呀?为什么如此多此一举呢?
原因很简单,如果workerman突然出问题掉了,那定时器延迟的一些数据是不是就终止了呢?这样会导致丢掉的数据无法去关闭订单啦!所以采用redis延迟消息列队,将数据存入redis中,即使workerman出问题掉了,重新启动workerman也可以将没消费的数据消费掉!
关于redis重启丢数据问题需要修改配置如下。
找到appendonly no 改为 appendonly yes
找到appendfsync 设置为 appendfsync everysec
解决redis重启了就丢数据的问题。
当然也可以使用其他的消息中间件来解决,比如mq,不过对于宝塔用户安装简介还是redis吧!
记住!不要定时器循环查数据库判断!不要定时器循环查数据库判断!不要定时器循环查数据库判断!
说三遍,数据库压力很大的~
当然该方案也适用拼团到期自动关闭该团等,可以自行脑补。
边栏推荐
- 被疫情占据的上半年,你还好么?| 2022年中总结
- 关于静态类型、动态类型、id、instancetype
- R language uses DT function to generate t-distribution density function data and plot function to visualize t-distribution density function data
- C#/VB. Net to add text / image watermarks to PDF documents
- test about BinaryTree
- QLabel 跑马灯文字显示
- Some understandings of tree LSTM and DGL code implementation
- Some recruitment markets in Shanghai refuse to recruit patients with covid-19 positive
- A wearable arm device for night and sleeveless blood pressure measurement [translation]
- Method of accessing mobile phone storage location permission under non root condition
猜你喜欢
一种用于夜间和无袖测量血压手臂可穿戴设备【翻译】
Method of accessing mobile phone storage location permission under non root condition
Oracle advanced (IV) table connection explanation
Graffiti intelligence is listed on the dual main board in Hong Kong: market value of 11.2 billion Hong Kong, with an annual revenue of 300 million US dollars
ROS custom message publishing subscription example
二叉搜索树
三年Android开发,2022疫情期间八家大厂的Android面试经历和真题整理
提前解锁 2 大直播主题!今天手把手教你如何完成软件包集成?|第 29-30 期
How are you in the first half of the year occupied by the epidemic| Mid 2022 summary
多线程基础:线程基本概念与线程的创建
随机推荐
R语言ggplot2可视化:使用ggpubr包的ggstripchart函数可视化分组点状条带图(dot strip plot)、设置add参数为不同水平点状条带图添加箱图
Xu Xiang's wife Ying Ying responded to the "stock review": she wrote it!
[Matlab] Simulink 同一模块的输入输出的变量不能同名
pytorch常见损失函数
R language ggplot2 visualization: use the ggstripchart function of ggpubr package to visualize the grouped dot strip plot, and set the add parameter to add box plots for different levels of dot strip
R language ggplot2 visual time series histogram: visual time series histogram through two-color gradient color matching color theme
抽象类与抽象方法
About static type, dynamic type, ID, instancetype
R language ggplot2 visualization: use ggviolin function of ggpubr package to visualize violin diagram
Qlabel marquee text display
Nuc11 cheetah Canyon setting U disk startup
同宇新材冲刺深交所:年营收9.47亿 张驰与苏世国为实控人
使用map函数、split函数一行键入多个元素
The role of applet in industrial Internet
Meilu biological IPO was terminated: the annual revenue was 385million, and Chen Lin was the actual controller
能源行业的数字化“新”运维
If you have any problems, you can contact me. A rookie ~
Implementation of AVL tree
AutoCAD - what is the default lineweight for centerline drawing and CAD? Can I modify it?
Pychrm Community Edition calls matplotlib pyplot. Solution of imshow() function image not popping up