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;
        }
        // 自己的業務邏輯
        // 查詢訂單,修改訂單 等等
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章