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.
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.
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:
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"
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.
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.
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.
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');
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); }
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!