要用redis存數(shù)組,string類型的方式存儲(chǔ)。
使用PHP自帶的json_encode和json_decode轉(zhuǎn)換成json(失?。?。
PHP自帶的序列化函數(shù)serialize和unserialize函數(shù)(成功)。
有什么具體的差別嗎?有大俠講一下成功和失敗的原理嗎
擁有18年軟件開(kāi)發(fā)和IT教學(xué)經(jīng)驗(yàn)。曾任多家上市公司技術(shù)總監(jiān)、架構(gòu)師、項(xiàng)目經(jīng)理、高級(jí)軟件工程師等職務(wù)。 網(wǎng)絡(luò)人氣名人講師,...
看上去和 redis 關(guān)系不大吧。set 和 get 的 JSON 字符串應(yīng)該是一致的吧。
你可以直接先把 json_encode
的字符串直接 json_decode
的結(jié)果打印出來(lái)看看。
我猜有可能是 json_decode($str, true)
少了參數(shù)寫(xiě)成 json_decode($str)
了,導(dǎo)致結(jié)果是一個(gè)對(duì)象而不是數(shù)組。
序列化和JSON本質(zhì)上不是一回事, json是種數(shù)據(jù)格式
序列化是指把運(yùn)行環(huán)境中的數(shù)據(jù)對(duì)象轉(zhuǎn)化為流數(shù)據(jù), 使之可以保存到文件或網(wǎng)絡(luò)傳輸?shù)絼e的地方使用.
這個(gè)流數(shù)據(jù)經(jīng)反序列化, 會(huì)還原為該語(yǔ)言下的數(shù)據(jù)對(duì)象
每個(gè)語(yǔ)言都有自己的序列化方法
php 有比serialize更高效的方法, 便是
igbinary_serialize() 和
igbinary_unserialize()
這兩方法需要安裝ibginary模塊
使用redis時(shí)配置
$reids->setOption(Redis::OPT_SERIALIZER,Redis::SERIALIZER_IGBINARY);
redis自動(dòng)會(huì)進(jìn)行序列化處理, 而不要每次都序列化后再set, 每次get后都要反序列化
關(guān)于序列化, 拿PHP來(lái)說(shuō)
class Person{
private $_name = "default";
public function get_name(){
return $this->_name;
}
}
$p = new Person;
$sp = serialize($p);
send2serverB($p);
你在A服務(wù)器序列化了一個(gè)對(duì)象實(shí)例, 在服務(wù)B中要使用該實(shí)例
當(dāng)然, 服務(wù)器B中也需要有類 Person的聲明, 才能正常反序列化
function recieve_handle($sp){
$p = unserialize($p);
// 反序列后, 能還原Person實(shí)例, 能使用實(shí)例的方法
// json只是種保存元數(shù)據(jù)的格式, 無(wú)法保存對(duì)象
$name = $p->get_name();
}
因?yàn)閿?shù)據(jù)要保存或傳輸(所謂的I/O), 所以才有序列化一說(shuō)
json是種常用的數(shù)據(jù)流格式, 但它只能存元數(shù)據(jù), 無(wú)法表達(dá)復(fù)雜的對(duì)象屬性和方法