一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - php使用redis的有序集合zset實現延遲隊列應用示例

php使用redis的有序集合zset實現延遲隊列應用示例

2021-09-29 13:38懷素真 PHP教程

這篇文章主要介紹了php使用redis的有序集合zset實現延遲隊列,結合具體實例形式分析了PHP基于redis的有序集合zset實現延遲隊列的具體原理、應用場景及相關操作技巧,需要的朋友可以參考下

本文實例講述了php使用redis的有序集合zset實現延遲隊列。分享給大家供大家參考,具體如下:

延遲隊列就是個帶延遲功能的消息隊列,相對于普通隊列,它可以在指定時間消費掉消息。

延遲隊列的應用場景:

1、新用戶注冊,10分鐘后發送郵件或站內信。

2、用戶下單后,30分鐘未支付,訂單自動作廢。

我們通過redis的有序集合zset來實現簡單的延遲隊列,將消息數據序列化,作為zset的value,把消息處理時間作為score,每次通過zRangeByScore獲取一條消息進行處理。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
class DelayQueue
{
  protected $prefix = 'delay_queue:';
  protected $redis = null;
  protected $key = '';
  public function __construct($queue, $config = [])
  {
    $this->key = $this->prefix . $queue;
    $this->redis = new Redis();
    $this->redis->connect($config['host'], $config['port'], $config['timeout']);
    $this->redis->auth($config['auth']);
  }
  public function delTask($value)
  {
    return $this->redis->zRem($this->key, $value);
  }
  public function getTask()
  {
    //獲取任務,以0和當前時間為區間,返回一條記錄
    return $this->redis->zRangeByScore($this->key, 0, time(), ['limit' => [0, 1]]);
  }
  public function addTask($name, $time, $data)
  {
    //添加任務,以時間作為score,對任務隊列按時間從小到大排序
    return $this->redis->zAdd(
      $this->key,
      $time,
      json_encode([
        'task_name' => $name,
        'task_time' => $time,
        'task_params' => $data,
      ], JSON_UNESCAPED_UNICODE)
    );
  }
  public function run()
  {
    //每次只取一條任務
    $task = $this->getTask();
    if (empty($task)) {
      return false;
    }
    $task = $task[0];
    //有并發的可能,這里通過zrem返回值判斷誰搶到該任務
    if ($this->delTask($task)) {
      $task = json_decode($task, true);
      //處理任務
      echo '任務:' . $task['task_name'] . ' 運行時間:' . date('Y-m-d H:i:s') . PHP_EOL;
      return true;
    }
    return false;
  }
}
$dq = new DelayQueue('close_order', [
  'host' => '127.0.0.1',
  'port' => 6379,
  'auth' => '',
  'timeout' => 60,
]);
$dq->addTask('close_order_111', time() + 30, ['order_id' => '111']);
$dq->addTask('close_order_222', time() + 60, ['order_id' => '222']);
$dq->addTask('close_order_333', time() + 90, ['order_id' => '333']);

然后,我們寫一個php腳本,用來處理隊列中的任務。

?
1
2
3
4
5
6
7
8
9
10
11
12
<?php
set_time_limit(0);
$dq = new DelayQueue('close_order', [
  'host' => '127.0.0.1',
  'port' => 6379,
  'auth' => '',
  'timeout' => 60,
]);
while (true) {
  $dq->run();
  usleep(100000);
}

希望本文所述對大家PHP程序設計有所幫助。

原文鏈接:https://www.cnblogs.com/jkko123/p/10614696.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品123区在线观看 | 免费网站国产 | 99热这里只有精品免费 | 92国产福利久久青青草原 | 学生小泬无遮挡女HD | 亚洲六月丁香六月婷婷色伊人 | 国产亚洲自愉自愉 | 免费观看伦理片 | 女教师被学生糟蹋三天 | 欧洲兽皇 | 视频国产91 | 亚洲干综合 | 娇妻与公陈峰姚瑶最新版 | 3d动漫美女被吸乳羞羞有 | 日本精品一卡二卡≡卡四卡 | 99久久精品国产综合一区 | 吻戏辣妞范1000免费体验 | 日本96在线精品视频免费观看 | 免费观看俄罗斯特黄特色 | 精品日韩欧美一区二区三区 | 超级乱淫1| 成人亚洲欧美日韩在线观看 | 国产精品久久久久久久久久久搜索 | 免费视频大全 | juliaann厨房大战 | 色综合网亚洲精品久久 | 边摸边吃奶又黄激烈视频韩国 | 4455四色永久免费 | 无码人妻精品一区二区蜜桃在线看 | 青草青草伊人精品视频 | 国产尤物视频 | 国产亚洲精品福利在线 | 国产亚洲玖玖玖在线观看 | 精品人伦一区二区三区潘金莲 | 美女班主任让我爽了一夜视频 | 成人免费公开视频 | 媳妇和公公小说 | 成人一级黄色大片 | 99九九精品免费视频观看 | 亚洲第一在线播放 | 久热这里在线精品 |