php redis 队列实现
使用 PHP 和 Redis 实现队列
Redis 是一个高性能的键值存储系统,支持多种数据结构,包括列表(List),非常适合实现队列功能。以下是使用 PHP 和 Redis 实现队列的详细方法。
安装 Redis 扩展
确保 PHP 已安装 Redis 扩展。可以通过以下命令安装:
pecl install redis
然后在 php.ini 文件中添加:
extension=redis.so
连接 Redis
在 PHP 中连接 Redis 服务器:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
基本队列操作
Redis 的列表结构支持队列的先进先出(FIFO)操作。以下是基本操作示例:
入队(Enqueue)
使用 rpush 将元素添加到队列尾部:
$redis->rpush('my_queue', 'task1');
$redis->rpush('my_queue', 'task2');
出队(Dequeue)
使用 lpop 从队列头部取出元素:

$task = $redis->lpop('my_queue');
echo $task; // 输出: task1
阻塞式队列
如果需要阻塞式队列(当队列为空时等待新任务),可以使用 blpop:
$task = $redis->blpop('my_queue', 10); // 等待 10 秒
if ($task) {
echo $task[1]; // 输出队列中的任务
}
队列长度检查
检查队列中剩余的任务数量:
$length = $redis->llen('my_queue');
echo "队列长度: " . $length;
优先级队列
如果需要实现优先级队列,可以使用多个队列或有序集合(Sorted Set)。以下是有序集合的示例:
入队

$redis->zadd('priority_queue', 1, 'low_priority_task');
$redis->zadd('priority_queue', 3, 'high_priority_task');
出队
$tasks = $redis->zrange('priority_queue', 0, -1, ['withscores' => true]);
foreach ($tasks as $task => $score) {
echo "任务: $task, 优先级: $score\n";
}
错误处理
在实际应用中,需要处理 Redis 连接失败或操作异常的情况:
try {
$redis->connect('127.0.0.1', 6379);
$redis->ping();
} catch (Exception $e) {
echo "Redis 连接失败: " . $e->getMessage();
}
完整示例
以下是一个完整的生产者-消费者模型示例:
生产者(producer.php)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
for ($i = 1; $i <= 5; $i++) {
$redis->rpush('my_queue', "task_$i");
echo "已添加任务: task_$i\n";
}
消费者(consumer.php)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
while (true) {
$task = $redis->blpop('my_queue', 10);
if ($task) {
echo "处理任务: " . $task[1] . "\n";
} else {
echo "队列为空,等待新任务...\n";
}
}
通过以上方法,可以轻松实现 PHP 和 Redis 的队列功能,适用于任务调度、消息传递等场景。






