【问题标题】:Laravel build a queue object using redis cacheLaravel 使用 redis 缓存构建队列对象
【发布时间】:2018-03-28 21:04:27
【问题描述】:

我正在试图弄清楚一些事情,我构建了一个记录器来跟踪某些事件的发生。这些情况经常发生(即每分钟 1-500 次)。

为了正确优化这一点,我将存储到 redis,然后我有一个任务从 redis 中获取队列对象,清除缓存键并将每个单独的条目插入到数据库中。

当我的记录器完成观察数据时,我的析构函数中发生了排队。

出于显而易见的原因,我不希望每次都发生 db 写入,所以为了加快速度,我先写入 redis,然后在任务中刷新到 db。

问题是我的队列实现如下:

  1. 从 redis 中获取 key xyz 的对象
  2. 向对象追加新条目
  3. 在 redis 中存储带有键 xyz 的对象

这是低效的,我希望能够直接进入 redis 队列。 Redis 有一个内置的列表类型,我可以使用它,但 laravel redis 驱动程序不支持它。我试图找出一种从 laravel 向 redis 发送原始命令的方法,但我似乎无法让它工作。

我想只将键存储到 redis 中的标签中,但我很快发现 laravel 的标签实现不是“正确的”,并且不允许在没有键的情况下获取标签项目,所以我不能将标签用作队列每个键都有一个对象。

如果有人知道我如何直接与 redis 对话并使用列表,或者如果我错过了什么,那真的很有帮助。

【问题讨论】:

  • Laravel Redis 驱动不支持列表是什么意思?我很确定我已经使用过它,如果没有,您可以随时切换 Redis 驱动程序。您能否分享一下您对列表命令的尝试?
  • 该死,你让我意识到我正在使用他们提供的外观。挖掘他们的代码并找到“getRedis()”,它返回一个 redis 客户端的实例。如果我这样做: $redis = Cache::getRedis(); $redis->rpush('test.key', 'data');它有效。
  • 文档中有如下提示:Of course, as mentioned above, you may call any of the Redis commands on the Redis facade. Laravel uses magic methods to pass the commands to the Redis server, so pass the arguments the Redis command expects(source)

标签: laravel data-structures redis


【解决方案1】:

编辑

虽然下面的方法确实有效,但有一种更合适的方法可以使用 redis 的外观作为回复,这里有更多信息:Documentation

好的,如果有人遇到这个。我没有看到它在任何地方正确记录,您需要执行以下操作:

-> 通过 laravel 提供的 Cache 门面获取一个 redis 的实例。

$redis = Cache::getRedis();

-> 通过它调用redis函数。

 $redis->rpush('test.key', 'data');

我相信你会想要 predis 作为你的驱动程序。

如果您正在构建日志驱动程序,您需要实现以下两个功能:

public function cacheEnqueue($data) : int
{
    $size = $this->_redis->lpush($this->getCacheKey("c_stack_queue"), $data);

    if ($size > 2000)
    {
        //prevent runaway logs
        $this->_redis->ltrim($this->getCacheKey("c_stack_queue"), 0, 2000);
    }


    return $size;
}

/**
 * Fetch items from stack. Multi-thread safe,
 *
 * @param  int $number Fetch last x items.
 * 
 * @return array
 */
public function cachePopMulti(int $number) : array
{
    $data = $this->_redis->lrange($this->getCacheKey("c_stack_queue"), -$number, -1);

    $this->_redis->ltrim($this->getCacheKey("c_stack_queue"), 0, -1 * ($number + 1));

    return $data;
}

当然,写你自己的密钥生成器getCacheKey()

【讨论】:

    猜你喜欢
    • 2013-09-02
    • 2016-03-29
    • 2018-05-25
    • 2018-01-30
    • 2017-05-24
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    相关资源
    最近更新 更多