Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan Redis untuk melaksanakan tugas berjadual teragih dalam PHP

Menggunakan Redis untuk melaksanakan tugas berjadual teragih dalam PHP

王林
王林asal
2023-05-15 14:01:361099semak imbas

Redis ialah pangkalan data dalam memori berprestasi tinggi yang mempunyai kelebihan kelajuan baca dan tulis yang pantas, menyokong tahap kegigihan tertentu dan jenis data yang kaya. Redis sering digunakan dalam senario seperti caching, baris gilir mesej dan kedudukan masa nyata. Semasa pembangunan, kadangkala kami perlu melaksanakan tugas berjadual yang diedarkan, seperti menghantar e-mel, membersihkan fail sementara, mengemas kini cache, dsb. Artikel ini akan memperkenalkan cara menggunakan Redis untuk melaksanakan tugas berjadual teragih.

1. Jenis data yang disokong oleh Redis

Jenis data yang disokong oleh Redis termasuk: rentetan, cincang, senarai, set dan set tersusun. Apabila melaksanakan tugas berjadual teragih, kami memberi tumpuan terutamanya pada dua jenis data: set tersusun dan senarai.

  1. Set Tertib

Set Tertib ialah jenis data yang disediakan oleh Redis Ia serupa dengan jadual cincang dan boleh menyimpan pasangan nilai kunci, tetapi nilainya (juga dipanggil skor) boleh diulang, dan setiap nilai dikaitkan dengan skor, yang digunakan untuk mengisih. Unsur-unsur dalam set tersusun diisih dari kecil ke besar mengikut skor.

Apabila menggunakan set tersusun untuk melaksanakan tugas berjadual teragih, kita boleh menggunakan masa pelaksanaan tugas sebagai skor, kandungan tugasan sebagai nilai dan menyimpan setiap tugasan ke dalam set tersusun.

  1. Senarai

Senarai ialah jenis data yang disediakan oleh Redis serupa dengan tatasusunan dan boleh menambah atau memadamkan elemen daripada kepala atau ekor senarai. Redis menyediakan senarai perintah yang kaya, seperti: lpush, rpush, lpop, rpop, dsb.

Apabila menggunakan senarai untuk melaksanakan tugas berjadual teragih, kami boleh menyimpan kandungan tugasan ke senarai dan menggunakan arahan lpop untuk mendapatkan tugasan untuk pelaksanaan.

2. Langkah-langkah untuk melaksanakan tugas berjadual teragih

Melaksanakan tugas berjadual teragih boleh dibahagikan secara kasar kepada langkah berikut:

  1. Tambahkan tugasan pada koleksi senarai tersusun dan tetapkan masa pelaksanaan tugas sebagai markah.
  2. Mulakan proses latar belakang untuk mengimbas tugasan dalam koleksi tersusun, tentukan sama ada tugasan itu perlu dilaksanakan dan tambahkan tugasan yang perlu dilaksanakan pada senarai tugasan.
  3. Mulakan berbilang proses Pekerja dan pop tugasan daripada senarai tugasan untuk dilaksanakan.
  4. Selepas pelaksanaan, padamkan tugasan daripada set yang dipesan.
  5. Tambah tugasan pada set tersusun

Gunakan arahan berikut untuk menambah tugasan pada set tersusun:

kandungan cap masa tugas ZADD

Antara mereka, tugas ialah nama set yang dipesan, cap waktu ialah masa pelaksanaan tugas (cap waktu Unix), dan kandungan ialah kandungan tugasan.

Sebagai contoh, untuk menambah tugasan "Hantar Mel" ke set yang dipesan, selepas masa pelaksanaan ialah 10 minit, anda boleh menggunakan arahan berikut:

tugas ZADD $(date -d "+10 minit" +%s) "hantar e-mel"

  1. Imbas tugas dalam koleksi yang dipesan

Mulakan proses latar belakang dan gunakan arahan berikut untuk mendapatkannya daripada koleksi yang dipesan Semua tugas yang perlu dilakukan:

tugas ZRANGEBYSCORE -inf $(tarikh +%s) WITHSCORES

Di mana -inf mewakili nilai minimum dalam set yang dipesan, $(tarikh +%s) mewakili cap waktu Unix masa semasa.

Arahan di atas akan mengembalikan senarai dengan markah, contohnya:

1) "clear temp files"
2) "1626387489"

Di mana, "clear temp files" ialah kandungan tugasan dan "1626387489" ialah masa pelaksanaan tugas.

Setelah memperoleh semua tugasan yang perlu dilaksanakan, tambahkan tugasan ini pada senarai tugasan.

  1. Laksanakan tugas

Mulakan berbilang proses Pekerja dan pop tugasan daripada senarai tugasan untuk dilaksanakan. Selepas pelaksanaan, tugas dikeluarkan daripada set yang diperintahkan.

Gunakan arahan berikut untuk mengeluarkan tugasan daripada senarai dan melaksanakannya:

tugasan lpop

Di mana, tugas ialah nama senarai.

  1. Padam tugasan daripada set yang dipesan

Selepas tugasan dilaksanakan, gunakan arahan berikut untuk memadamkan tugasan daripada set yang dipesan:

Kandungan tugasan ZREM

Di mana, tugas ialah nama koleksi yang dipesan, dan kandungan ialah kandungan tugasan.

3. Pelaksanaan kod

Di bawah ini kami menggunakan PHP untuk melaksanakan langkah di atas.

  1. Tambahkan tugasan pada set yang dipesan

Gunakan kod berikut untuk menambah tugasan pada set yang dipesan:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 添加任务到有序集合
$timestamp = strtotime("+10 minutes");
$redis->zAdd('tasks', $timestamp, 'send email');
  1. Imbas Tugasan dalam set tertib

Gunakan kod berikut untuk mengimbas tugasan dalam set tersusun dan tambahkan tugasan yang perlu dilaksanakan pada senarai tugas:

while(true) {
    // 扫描有序集合中的任务
    $scoreTasks = $redis->zRangeByScore('tasks', '-inf', time(), array('withscores' => true));
    foreach($scoreTasks as $task => $score) {
        // 将需要执行的任务添加到任务列表中
        $redis->lpush('task_list', $task);
        // 将任务从有序集合中删除
        $redis->zRem('tasks', $task);
    }
    // 每隔5秒扫描一次
    sleep(5);
}
  1. Laksanakan Tugasan

Gunakan kod berikut untuk memulakan berbilang proses Pekerja dan pop up tugasan daripada senarai tugasan untuk pelaksanaan:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

for($i=0; $i<10; $i++) {
    // 启动10个Worker进程
    $pid = pcntl_fork();
    if($pid == -1) {
        echo 'fork error!' . PHP_EOL;
        exit;
    } else if($pid == 0) {
        // 子进程中获取任务列表中的任务并执行
        while(true) {
            // 从列表中弹出一条任务
            $task = $redis->rpop('task_list');
            if(empty($task)) {
                continue;
            }
            // 执行任务
            mail('user@example.com', 'Task', $task);
        }
    }
}

4. Ringkasan

Perkara di atas dilaksanakan menggunakan Redis Langkah dan pelaksanaan kod tugasan berjadual yang diedarkan. Menggunakan Redis boleh melaksanakan penjadualan tugas teragih dengan mudah dan meningkatkan keupayaan pemprosesan serentak dan kecekapan pelaksanaan tugas. Dalam aplikasi sebenar, kita perlu mengoptimumkan kod mengikut situasi sebenar, seperti menggunakan kunci untuk melaksanakan akses yang saling eksklusif kepada senarai tugas, menggunakan pemasa untuk mendapatkan tugas dengan kerap, dsb.

Atas ialah kandungan terperinci Menggunakan Redis untuk melaksanakan tugas berjadual teragih dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn