php redis 队列实现
PHP Redis 队列实现
Redis 是一个高性能的键值存储系统,常被用作队列服务。PHP 可以通过 phpredis 或 predis 扩展与 Redis 交互,实现队列功能。
安装 Redis 扩展
确保已安装 Redis 扩展。可以通过以下命令安装 phpredis:
pecl install redis
然后在 php.ini 中添加:
extension=redis.so
基本队列操作
使用 Redis 的 LPUSH 和 BRPOP 命令可以实现简单的队列功能。以下是一个基本示例:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 生产者:将任务推入队列
$redis->lPush('task_queue', json_encode(['task_id' => 123, 'data' => 'example']));
// 消费者:阻塞式获取任务
while (true) {
$task = $redis->brPop('task_queue', 0);
$data = json_decode($task[1], true);
echo "Processing task: " . $data['task_id'] . "\n";
}
使用 Predis 客户端
如果不想使用 phpredis,可以改用 predis 客户端。安装 predis:
composer require predis/predis
示例代码:
require 'vendor/autoload.php';
$client = new Predis\Client();
// 生产者
$client->lpush('task_queue', json_encode(['task_id' => 456, 'data' => 'predis_example']));
// 消费者
while (true) {
$task = $client->brpop('task_queue', 0);
$data = json_decode($task[1], true);
echo "Processing task: " . $data['task_id'] . "\n";
}
处理失败任务
为了避免任务失败后丢失,可以实现一个重试机制:
$max_retries = 3;
$retry_queue = 'task_retry_queue';
// 消费者逻辑
$task = $redis->brPop('task_queue', 0);
$data = json_decode($task[1], true);
try {
// 处理任务
process_task($data);
} catch (Exception $e) {
if ($data['retry_count'] < $max_retries) {
$data['retry_count']++;
$redis->lPush($retry_queue, json_encode($data));
} else {
// 记录失败任务
$redis->lPush('failed_tasks', json_encode($data));
}
}
延迟队列
Redis 可以通过 ZSET 实现延迟队列:
// 生产者:添加延迟任务(5秒后执行)
$redis->zAdd('delayed_queue', time() + 5, json_encode(['task_id' => 789]));
// 消费者:检查并处理到期任务
while (true) {
$tasks = $redis->zRangeByScore('delayed_queue', 0, time());
foreach ($tasks as $task) {
$data = json_decode($task, true);
echo "Processing delayed task: " . $data['task_id'] . "\n";
$redis->zRem('delayed_queue', $task);
}
sleep(1);
}
使用 Laravel 的队列系统
如果使用 Laravel,可以直接利用其内置的 Redis 队列功能。配置 .env:
QUEUE_CONNECTION=redis
生成任务类:
php artisan make:job ProcessTask
在 ProcessTask 类中实现逻辑:
public function handle()
{
// 任务处理逻辑
}
分发任务:
ProcessTask::dispatch(['data' => 'example']);
启动队列处理器:
php artisan queue:work
通过以上方法,可以灵活地在 PHP 中实现 Redis 队列功能。







