Laravel使用redis缓存构建队列对象

时间:2018-03-28 21:04:28

标签: laravel data-structures redis

我正在努力解决问题,我建立了一个记录器来跟踪发生的某些事件。这些经常发生(即每分钟1-500次)。

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

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

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

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

  1. 使用redis
  2. 中的密钥xyz获取对象
  3. 将新条目追加到对象
  4. 使用redis中的密钥xyz存储对象
  5. 这是低效的,我希望能够直接排入redis。 Redis有一个我可以使用的内置列表类型,但是laravel redis驱动程序不支持它。我试图找出一种从laravel向redis发送原始命令的方法,但我似乎无法使它工作。

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

    如果有人知道如何直接与redis交谈并使用列表,或者如果我错过了什么,那将会非常有帮助。

1 个答案:

答案 0 :(得分:0)

修改

虽然下面的方法确实有效,但有一种更合适的方法可以使用redis的外观作为回复提及,更多信息请点击此处:Documentation

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

- >通过Cache facade laravel提供的redis实例。

$redis = Cache::getRedis();

- >通过它调用redis函数。

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

我相信你会想要将普雷西斯作为你的司机。

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

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()