movisio/redis-queue

此包的最新版本(v1.0)没有可用的许可证信息。

简单的Redis消息队列

v1.0 2021-11-25 11:47 UTC

This package is auto-updated.

Last update: 2024-09-25 17:56:19 UTC


README

这是一个使用Redis列表和kdyby/redis帮助实现的简单队列实现。

安装

使用composer安装

composer require movisio/redis-queue

Nette服务配置

将以下内容添加到config.neon中

services:
  - Movisio\RedisQueue\Factory

对于更复杂的设置,如目录或目录:子目录,请使用

services:
    RedisQueue:
        factory: Movisio\RedisQueue\Factory
        setup:
          - setNamespace("MyQueues") # directory
          - setNamespace("Directory:%redisNamespace%") # subdirectory from parameter

用法

首先,创建工厂。如果你使用Nette服务,则跳过此步骤。

/** @var \Kdyby\Redis\RedisClient $redisClient */

$factory = new \Movisio\RedisQueue\Factory($redisClient);
$factory->setNamespace("Queues:MyCustomQueues"); # optional

如果使用Nette服务,请注入Factory

class MyPresenter {
    /** @var \Movisio\RedisQueue\Factory @inject */
    public \Movisio\RedisQueue\Factory $queueFactory;
}

然后创建队列并将消息push()到其中。返回值是队列的新长度。

$queue = $this->queueFactory->get("QueueName");
$queueLength = $queue->push("TestMessage");

要从队列中读取,你可以使用wait()方法,该方法将移除并返回队列中的第一个值,或者直到有一个可用的值为止。参数是秒数,默认为30。

while (true) {
    $message = $queue->wait(30); // wait 30 seconds
    if (is_null($message)) {
        echo "queue is empty";
        continue; // or some fallback load from database
    }
    echo "found message: " . $message;
}

如果你只想检查队列是否为空而不等待超时,请使用pop()方法,它将移除并返回队列中的第一个值。

$message = $queue->pop();
if (is_null($message)) {
    echo "Queue is empty";
}