在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的协议说明日本语手册,发现比想象中简单。
通过查看核心实现,可以看到正在创建并发送符合协议的字符串。

广告
将在 10 秒后关闭
bannerAds