복붙노트

[REDIS] PHP - 레디 스 -를 직렬화없이 레디 스에서 PHP의 객체를 저장할 수있는 방법이 있습니까?

REDIS

PHP - 레디 스 -를 직렬화없이 레디 스에서 PHP의 객체를 저장할 수있는 방법이 있습니까?

나는 키와 레디 스의 값으로 해당 키에 해당하는 PHP 객체로서 '요청 URL을 사용자가 저장하려합니다. 나는 다음을 시도 :

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

그러나,이 코드 레디 스에 저장되고있는 URL 키의 값은 값이 문자열의 형식은 '객체'대신 실제 PHP 개체와 동일합니다. 를 직렬화하지 않고 PHP의 객체를 저장할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.당신은 레디 스 데이터 유형에서 볼 수 있듯이, 레디 스 만이 5 개 데이터 유형을 지원합니다 :

    당신은 레디 스 데이터 유형에서 볼 수 있듯이, 레디 스 만이 5 개 데이터 유형을 지원합니다 :

    그래서, 어떤 객체 데이터 형이없는, 따라서 당신은 값으로 직접 객체를 저장 할 수 없습니다. 당신은 (예를 들어,로 json_encode 기능 또는 JSON 인코딩을) 먼저 직렬화해야합니다.

    당신이 직접 객체를 포함 주장하는 것을 직렬화에 문제가 있습니까?

    업데이트 : 당신이 코멘트에 말에 따르면, 당신이 방법을 사용할 수는이 답변에 표시된

    당신이 사용할 수 있도록 :

    $xml = $simpleXmlElem->asXML();
    

    직렬화하기 전에, 다음 때 unserialize () 한 후, 다음 코드를 사용 :

    $simpleXmlElem = simplexml_load_string($xml);
    

    이 방법을 사용하면 내장 된 객체 SimpleXmlElement처럼 직접 PHP를 직렬화하지 않아도 아무런 문제가 없을 것입니다.

  2. ==============================

    2.직렬화하는 것은 가장 간단한 방법이 될 것입니다.

    직렬화하는 것은 가장 간단한 방법이 될 것입니다.

    대안은 나중에 객체를 재구성하는 데 필요한 매개 변수 만로 json_encode하는 것입니다. 이렇게하는 한 가지 방법은 PHP 5.4의 JsonSerialize 인터페이스를 사용하고 있습니다. 당신은 jsonSerialize를 사용하여 다양한 속성을 추출하고 다음 레디 스에서 항목을 끌어 때 다시 클래스에 전달할 수있는 수단을 제공 할 것입니다.

    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,
            ];
        }
    
    }
    

    이러한 방법으로 쉽게 JSON에서 재구성 할 수있게되었습니다. 당신은 그렇게 아니면 그냥 세터를 호출하는 도우미 메서드를 추가 할 수 있습니다.

  3. ==============================

    3.여기에 내가 그것을 할 방법입니다 :

    여기에 내가 그것을 할 방법입니다 :

    class Cache extends Predis\Client {
        protected $prefix = 'myapp:';
    
        public function take($key, $value = null, $ttl = null) {
            $value = is_object($value) ? serialize($value) : $value;
            $key   = $this->prefix . $key;
            if (!$this->exists($key)) {
                if (intval($ttl)) {
                    $this->setEx($key, $ttl, $value);
                } else {
                    $this->set($key, $value);
                }
            }
            return $this->get($key);
        }
    }
    

    용법:

    $cache = new Cache;
    
    $lorem     = 'Lorem ipsum dolor sit amet';
    $loremLong = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';
    
    $cachedLorem          = $cache->take('lorem', $lorem);
    $cachedLoremLong      = $cache->take('loremLong', $loremLong);
    $cachedLoremTtl       = $cache->take('loremTtl', $lorem, 30);
    $cachedLoremGet       = $cache->take('lorem');
    $cachedLoremObject    = $cache->take('loremObject', new stdClass);
    $cachedLoremObjectTtl = $cache->take('loremObjectTtl', new stdClass, 45);
    
    echo $cachedLorem;
    echo $cachedLoremLong;
    echo $cachedLoremTtl;
    echo $cachedLoremGet;
    echo $cachedLoremObject;
    echo $cachedLoremObjectTtl;
    

    산출:

    Lorem ipsum dolor sit amet
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    Lorem ipsum dolor sit amet
    Lorem ipsum dolor sit amet
    O:8:"stdClass":0:{}
    O:8:"stdClass":0:{}
    
  4. ==============================

    4.Aliweb의 대답에 추가!

    Aliweb의 대답에 추가!

    레디 스는 INCR, INCRBY, DECR 및 DECRBY 같은 정수뿐만 아니라 작업을 지원합니다.

    질문에 관해서는 :

    직렬화는 경우는 문자열 또는 INT 없습니다. 직렬화는 비용이 많이 드는 작업입니다!

    GET 및 HGET에 직렬화 경우 무엇을 보려고 :

    '

    private function string_unserialize($str){
            $data = @unserialize($str);
            if ($str === 'b:0;'){
                return 0;
            }elseif($data !== false){
                return $data;
            }else {
                return $str;
            }
        }
    

    '

  5. from https://stackoverflow.com/questions/26718263/php-redis-is-there-a-way-to-store-php-object-in-redis-without-serializing-it by cc-by-sa and MIT license