PHP基于Redis实现延迟队列
PHP基于Redis实现延迟队列
标签(空格分隔): php,redis,linux
解决思路
1. 基于Redis过期key事件
2. 基于Redis Zset特征处理
Redis-Zset
Zset 首先它是一个 set,这保证了内部 value 值的唯一性,其次它给每个 value 添加了一个 score(分值)属性,通过对分值的排序实现了有序化
Zset基本命令
zadd:新增成员
zrem:根据指定key进行删除
zrange:获取成员信息
zrangebyscore:指定分数区间,获取列表
zrevrangebyscore:根据分数区间,倒序展示列表
代码实现 【30分钟后未支付的订单改为已取消】
# 生成数据 推送数据到延迟队列
<?php
$redis = new \Redis();
$redis->connect("127.0.0.1", "6379");
$redis->auth("123456");
// 延迟队列名称为 OrderDelayQueue
// 分值为:当前时间戳+30分钟
// 成员为:订单编号
$redis->zAdd("OrderDelayQueue", time() + 30*60, "202302281101988899889");
# 消费数据
<?php
$redis = new \Redis();
$redis->connect("127.0.0.1", "6379");
$redis->auth("123456");
while (true) {
$result = $redis->zRangeByScore('OrderDelayQueue', 0, time(), ['limit' => [0, 1]]);
if (empty($result)) {
sleep(1);
continue;
}
$bool = $redis->zRem('OrderDelayQueue', $result[0]);
if (empty($bool)) {
sleep(1);
continue;
}
// 自己的业务逻辑
// 查询订单,修改订单 等等
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2020-02-28 跨域打开页面:Uncaught DOMException: Blocked a frame with origin