激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美一级淫片免费视频黄 | 欧美精品久久久久久久久久 | 免费在线观看成人av | 久久成年人视频 | 久久最新网址 | 在线中文资源免费 | 久久久一区二区三区精品 | 国产精品爱久久久久久久 | 白白在线免费视频 | 大胆在线日本aⅴ免费视频 美国黄色毛片女人性生活片 | 亚洲精品在线观看免费 | 日本羞羞影院 | 性生活视频软件 | 国产九色在线播放九色 | 久久精品视频69 | 狠狠操天天操 | 成人在线免费视频播放 | 国产乱淫av片免费网站 | 久久久久久久九九九九 | 国产精品免费一区二区三区在线观看 | 久久久婷婷 | 国产精品啪一品二区三区粉嫩 | 奇米888一区二区三区 | 亚洲男人的天堂在线视频 | 成人在线视频在线观看 | av手机在线免费播放 | 高清av免费| 久久日韩在线 | 亚洲人片在线观看 | 午夜伦情电午夜伦情电影 | 亚洲第一页中文字幕 | 一区二区视频在线看 | 91精品国产九九九久久久亚洲 | 免费久久久久 | 欧美成人午夜 | 久久国产成人精品国产成人亚洲 | 色吧久久 | 久久国产精品二国产精品中国洋人 | 精品国产观看 | 欧美成人一区免费视频 | 久久欧美亚洲另类专区91大神 |