php-redis - 有没有办法在Redis中存储PHP对象而不进行序列化?

Sai*_*ung 8 php redis phpredis

我试图将用户的请求URL作为密钥存储,并将与该密钥对应的PHP对象存储为Redis中的值.我尝试了以下方法:

$redisClient = new Redis();
$redisClient->connect('localhost', 6379);
$redisClient->set($_SERVER['REQUEST_URI'], $this->page);
$redisTest = $redisClient->get($_SERVER['REQUEST_URI']);
var_dump($redisTest);
Run Code Online (Sandbox Code Playgroud)

但是,使用此代码时,存储在Redis中的URL键的值是类型,string其值等于"Object"而不是实际的PHP对象.有没有办法存储PHP对象而不进行序列化?

Ali*_*web 7

正如您在Redis数据类型中看到的,Redis仅支持以下5种数据类型:

  • Stirng
  • 名单
  • 哈希
  • 排序集

因此,没有对象数据类型,因此您无法将对象直接存储为值.您必须先将其序列化(或者使用该json_encode函数对其进行JSON编码).

串行化是否存在直接存储对象的问题?

更新:根据您在评论中所说的内容,您可以使用此答案中指出的方法

所以你可以使用:

$xml = $simpleXmlElem->asXML();
Run Code Online (Sandbox Code Playgroud)

在序列化之前,然后unserialize()使用以下代码:

$simpleXmlElem = simplexml_load_string($xml);
Run Code Online (Sandbox Code Playgroud)

这样,您不必SimpleXmlElement直接序列化PHP内置对象,也不会出现问题.


bcm*_*cfc 3

序列化将是最直接的方法。

另一种方法是json_encode仅使用稍后重建对象所需的参数。一种方法是使用 PHP 5.4 的 JsonSerialize 接口。您需要使用 jsonSerialize 提取各种属性,然后在从 Redis 提取项目时提供将它们传递回您的类的方法。


class MyPage implements JsonSerializable
{

    protected $p1;
    protected $p2;

    /**
     * @param mixed $p1
     */
    public function setP1($p1)
    {
        $this->p1 = $p1;
    }

    /**
     * @param mixed $p2
     */
    public function setP2($p2)
    {
        $this->p2 = $p2;
    }

    /**
     * (PHP 5 &gt;= 5.4.0)<br/>
     * Specify data which should be serialized to JSON
     * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
     * @return mixed data which can be serialized by <b>json_encode</b>,
     * which is a value of any type other than a resource.
     */
    public function jsonSerialize()
    {
        return [
            'p1' => $this->p1,
            'p2' => $this->p2,
        ];
    }

}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以轻松地从 JSON 进行重建。您可以添加一个辅助方法来执行此操作,或者只调用设置器。