redis를 사용하여 배열을 저장하려면 문자열 형식으로 저장하세요.
PHP 자체 json_encode 및 json_decode를 사용하여 json으로 변환합니다(실패).
PHP 자체 직렬화 함수는 함수를 직렬화 및 역직렬화합니다(성공).
구체적인 차이점이 있나요? 성공과 실패의 원칙을 알려주실 분 계신가요?
배열을 문자열 형식으로 저장하려면 redis를 사용하세요.
PHP 자체 json_encode 및 json_decode를 사용하여 json으로 변환합니다(실패).
PHP 자체 직렬화 함수는 함수를 직렬화 및 역직렬화합니다(성공).
구체적인 차이점이 있나요? 성공과 실패의 원칙을 알려주실 분 계신가요?
redis와는 거의 관련이 없는 것 같습니다. set 및 get의 JSON 문자열은 일관성이 있어야 합니다.
json_encode
의 문자열과 json_decode
의 결과를 직접 인쇄해 볼 수 있습니다.
json_decode($str, true)
를 매개변수 없이 json_decode($str)
로 작성하면 결과가 배열이 아닌 객체가 될 가능성이 있는 것 같아요.
직렬화와 JSON은 본질적으로 동일하지 않습니다. json은 데이터 형식입니다
직렬화란 실행 중인 환경의 데이터 객체를 스트림 데이터로 변환하여 파일로 저장하거나 다른 곳에서 사용할 수 있도록 네트워크를 통해 전송하는 것을 말합니다.
직렬화 해제 후 이 스트림 데이터를 언어 데이터로 복원합니다.
아래의 객체 각 언어에는 고유한 직렬화 방법이 있습니다
php에는 직렬화보다 더 효율적인 방법이 있습니다.
igbinary_serialize() 및
igbinary_unserialize()
이 두 가지 방법은 ibginary 모듈을 설치해야 합니다.
redis 사용 시 구성
<code>$reids->setOption(Redis::OPT_SERIALIZER,Redis::SERIALIZER_IGBINARY); </code>
Redis는 자동으로 직렬화합니다. 매번 직렬화하고 설정하는 대신, 가져올 때마다 역직렬화해야 합니다.
직렬화에 대해 PHP를 예로 들어
<code>class Person{ private $_name = "default"; public function get_name(){ return $this->_name; } } $p = new Person; $sp = serialize($p); send2serverB($p);</code>
서버 A에서 객체 인스턴스를 직렬화했고, 이 인스턴스를 서비스 B에서 사용해야 합니다
물론 서버 B에서도 정상적으로 역직렬화하려면 Person 클래스 선언이 필요합니다
<code>function recieve_handle($sp){ $p = unserialize($p); // 反序列后, 能还原Person实例, 能使用实例的方法 // json只是种保存元数据的格式, 无法保存对象 $name = $p->get_name(); }</code>
데이터를 저장하거나 전송(소위 I/O)해야 하기 때문에 직렬화에 대한 이야기가 있습니다.
Json은 일반적으로 사용되는 데이터 스트림 형식이지만 메타데이터만 저장할 수 있고 복잡한 개체 속성을 표현할 수는 없습니다. 및 방법
데이터는 utf8이어야 합니다.
gbk는 인코딩할 수 없습니다
즉, json_encode는 객체를 직렬화할 수 없습니다