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;
        }
        // 自己的业务逻辑
        // 查询订单,修改订单 等等
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章