首頁 >後端開發 >php教程 >redis 保存陣列(json_encode不成功,serialize成功)

redis 保存陣列(json_encode不成功,serialize成功)

WBOY
WBOY原創
2016-10-10 11:56:242106瀏覽

要用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不能序列話物件

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn