我正在努力解决问题,我建立了一个记录器来跟踪发生的某些事件。这些经常发生(即每分钟1-500次)。
为了正确优化,我将存储到redis,然后我有一个从redis获取队列对象的任务,清除缓存键并将每个单独的条目插入到数据库中。
当我的记录器完成观察数据时,我在析构函数中发生了入队。
由于显而易见的原因,我不希望每次都发生数据库写入,所以为了加快速度,我写入redis然后在任务上刷新到db。
问题是我的队列实现如下:
这是低效的,我希望能够直接排入redis。 Redis有一个我可以使用的内置列表类型,但是laravel redis驱动程序不支持它。我试图找出一种从laravel向redis发送原始命令的方法,但我似乎无法使它工作。
我在考虑将密钥存储在redis中的标签中,但我很快发现laravel的标签实现不是“正确的”,并且不允许在没有密钥的情况下获取标记的项目,所以我不能将标签用作队列每个键都是其中的一个对象。
如果有人知道如何直接与redis交谈并使用列表,或者如果我错过了什么,那将会非常有帮助。
答案 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()