在FuelPHP上使用Redis存储数组
在使用FuelPHP中的Redis时,基本上会使用核心的Redis_Db。但是,由于不支持数组处理可变长度的数据(例如MGET),所以目前使用起来有些困难。
我认为还有其他方法,比如使用其他的redis库,但在这次我将尝试扩展Core。关于扩展的方法,请参考日本语网站。
扩展对象的函数
/**
* @param $name
* @param $args
* @return $this|array
* @throws \RedisException
*/
public function __call($name, $args)
{
// build the Redis unified protocol command
array_unshift($args, strtoupper($name));
$command = '*' . count($args) . CRLF;
foreach ($args as $arg) {
$command .= '$' . strlen($arg) . CRLF . $arg . CRLF;
}
// add it to the pipeline queue
$this->queue[] = $command;
if ($this->pipelined)
{
return $this;
}
else
{
return $this->execute();
}
}
我将修改前半部分,以创建要发送到Redis服务器的数据。
array_unshift($args, strtoupper($name));
$command = '*' . count($args) . CRLF;
foreach ($args as $arg) {
$command .= '$' . strlen($arg) . CRLF . $arg . CRLF;
}
实施
当拓展内容为数组时,我们将使用包括数组元素计数在内的数组本身作为数据。
public function __call($name, $args)
{
// build the Redis unified protocol command
$values = $args[0];
$name = strtoupper($name);
array_unshift($args, $name);
$cnt = is_array($values) ? count($values) + 1 : count($args);
$command = '*' . $cnt . CRLF;
if (is_array($values)) {
$command .= '$' . strlen($name) . CRLF . $name . CRLF;
$args = $values;
}
foreach ($args as $arg) {
$command .= '$' . strlen($arg) . CRLF . $arg . CRLF;
}
…
}
如果根据每个redis命令分别创建函数,而不是使用__call,通过对\$key=>\$value进行匹配,我认为使用MSET等命令也会更容易。
public function mset($args)
{
$cnt = count($args) * 2 + 1;
$command = '*' . $cnt . CRLF;
$command .= '$' . 4 . CRLF . 'MSET' . CRLF;
foreach ($args as $key => $value) {
$command .= '$' . strlen($key) . CRLF . $key . CRLF;
$command .= '$' . strlen($value) . CRLF . $value . CRLF;
}
// add it to the pipeline queue
$this->queue[] = $command;
if ($this->pipelined)
{
return $this;
}
else
{
return $this->execute();
}
}
简单的解释
FuelPHP的Redis是通过socket通信来实现的,而不使用库之类的东西,
因此需要创建符合协议的字符串。
一提到协议就觉得很复杂,但是通过查看Redis的协议说明日本语手册,发现比想象中简单。
通过查看核心实现,可以看到正在创建并发送符合协议的字符串。