要用redis存數組,string類型的方式儲存。
使用PHP自帶的json_encode和json_decode轉換成json(失敗)。
PHP自帶的序列化函數serialize和unserialize函數(成功)。
有什麼具體的差別嗎?有大俠講一下成功和失敗的原則嗎
要用redis存數組,string類型的方式儲存。
使用PHP自帶的json_encode和json_decode轉換成json(失敗)。
PHP自帶的序列化函數serialize和unserialize函數(成功)。
有什麼具體的差別嗎?有大俠講一下成功和失敗的原則嗎
看起來跟 redis 關係不大吧。 set 和 get 的 JSON 字串應該是一致的吧。
你可以直接先把 json_encode
的字串直接 json_decode
的結果印出來看看。
我猜有可能是 json_decode($str, true)
少了參數寫成 json_decode($str)
了,導致結果是一個物件而不是陣列。
序列化和JSON本質上不是一回事, json是種資料格式
序列化是指把運行環境中的資料對象轉換為流資料, 使之可以保存到文件或網絡傳輸到別的地方使用.
這個流數據經反序列化, 會還原為該語言下的數據對象
每個語言都有自己的序列化方法
php 有比serialize更有效率的方法, 便是
igbinary_serialize() 和
igbinary_unserialize()
這兩種方法需要安裝ibginary模組
使用redis時配置
<code>$reids->setOption(Redis::OPT_SERIALIZER,Redis::SERIALIZER_IGBINARY); </code>
redis自動會進行序列化處理, 而不要每次都序列化後再set, 每次get後都要反序列化
關於序列化, 拿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是encode不了的
就是json_encode不能序列話物件