php的memcache擴(kuò)展和memcached擴(kuò)展讀寫數(shù)組數(shù)據(jù)不相兼容原因探究

出處:http://www.akayzhang.com/article/6

背景

最近公司許多團(tuán)隊(duì)進(jìn)行升級(jí)php7婆殿,目前支持php7讀取mc的擴(kuò)展只有memcached。

但是公司許多項(xiàng)目都會(huì)共用一個(gè)mc集群來存取用戶session數(shù)據(jù),存的時(shí)候是登陸時(shí)用memcache擴(kuò)展以array的形式寫進(jìn)去莉炉,讀的時(shí)候自然是用memcache擴(kuò)展以array的形式讀出來庶骄。 但是現(xiàn)在只能使用memcached進(jìn)行讀取。但是據(jù)我所知兩者讀取array形式的數(shù)據(jù)是互不兼容的灌诅,因此想探究一下究竟是為什么芳来。

驗(yàn)證

驗(yàn)證memcache擴(kuò)展和memcached擴(kuò)展讀寫數(shù)組數(shù)據(jù)是否不相兼容

測(cè)試腳本:

echo "========== test? string? ============\n";

$mc = new Memcache;

$mc->addServer('10.199.189.129', 11511);

$key = 'testString';

$mc->set($key, 'test success');

var_dump($mc->get($key));

$mc2 = new memcached;

$mc2->addServer('10.199.189.129', 11511);

var_dump($mc2->get($key));

echo "========== test? array? ============\n";

$key2 = 'testArray';

$mc->set($key2, [1,2,3]);

var_dump($mc->get($key2));

var_dump($mc2->get($key2));

執(zhí)行結(jié)果:

?? ~ php /apps/dat/test.php

========== test? string? ============

string(12) "test success"

string(12) "test success"

========== test? array? ============

array(3) {

? ? [0]=> int(1)

? ? [1]=> int(2)

? ? [2]=> int(3)

}

int(0)

從結(jié)果來看,印證了我們之前的說法猜拾。以字符串類型的數(shù)據(jù)

猜測(cè)原因

由于string沒有問題即舌,出問題是在array格式里面。所以懷疑是array存進(jìn)mc時(shí)的序列化方法不同挎袜。于是乎進(jìn)行進(jìn)一步的測(cè)試:

編寫測(cè)試腳本

echo "========== test? array? ============\n";

$mc = new Memcache;

$mc->addServer('10.199.189.129', 11511);

$mc2 = new memcached;

$mc2->addServer('10.199.189.129', 11511);

$key2 = 'testArray1';

$key3 = 'testArray2';

$mc->set($key2, [1,2,3]);

$mc2->set($key3, [1,2,3]);

var_dump($mc->get($key2));

var_dump($mc2->get($key3));

執(zhí)行結(jié)果:

?? ~ php /apps/dat/test.php

========== test? array? ============

array(3) {

? ? [0]=> int(1)

? ? [1]=> int(2)

? ? [2]=> int(3)

}

array(3) {

? ? [0]=> int(1)

? ? [1]=> int(2)

? ? [2]=> int(3)

}

接下來直接連接mc進(jìn)行查看

?? ~ telnet 10.199.189.129 11511

Trying 10.199.189.129...

Connected to msession.vip.vip.co.

Escape character is '^]'.

get testArray1

VALUE testArray1 1 30

a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}

END

get testArray2

VALUE testArray2 4 30

a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}

END

從結(jié)果來看顽聂,我們可以發(fā)現(xiàn),memcache和memcached寫到mc里面的結(jié)果是一樣的盯仪,也就是說我們的猜測(cè)是錯(cuò)誤的紊搪。兩個(gè)值的序列化處理一模一樣,區(qū)別在于值的flag不同全景。 memcache存儲(chǔ)array數(shù)據(jù)的時(shí)候耀石,falg為1,而memcached為4. 我們知道爸黄,mc中值的flag是提供給使用者自定義滞伟,方便再讀取的時(shí)候做不同的處理。但是為什么兩者的flag定義會(huì)不相同呢炕贵。 抱著這個(gè)疑問梆奈,試著通過閱讀兩個(gè)擴(kuò)展的源碼查找原因。

閱讀源碼

memcache

php_memcache.h:

#define MMC_SERIALIZED 1

#define MMC_COMPRESSED 2

memcached

php_memcached.c

#define MEMC_VAL_IS_STRING? ? 0

#define MEMC_VAL_IS_LONG? ? ? 1

#define MEMC_VAL_IS_DOUBLE? ? 2

#define MEMC_VAL_IS_BOOL? ? ? 3

#define MEMC_VAL_IS_SERIALIZED 4

#define MEMC_VAL_IS_IGBINARY? 5

#define MEMC_VAL_IS_JSON? ? ? 6

#define MEMC_VAL_IS_MSGPACK? ? 7

經(jīng)閱讀源碼称开,發(fā)現(xiàn)memcache將array的數(shù)組格式的flag定義為1亩钟,而memcached為了將php存進(jìn)mc中的值進(jìn)行詳細(xì)的類型區(qū)分,將數(shù)據(jù)類型定義了string鳖轰,long清酥,double等等的數(shù)據(jù)類型。

也就是說脆霎,當(dāng)你使用memcache的時(shí)候总处,運(yùn)行

$mc = new memcache;

$mc->addServer('10.199.189.129', 11511);

$mc->set('123',1);

var_dump($mc->get('123'));

執(zhí)行結(jié)果是:

string(1) "1"

你明明存了一個(gè)值為數(shù)字1的key,但是讀取的時(shí)候卻為字符串睛蛛。 而當(dāng)你使用memcached的時(shí)候鹦马,運(yùn)行

$mc = new memcached;

$mc->addServer('10.199.189.129', 11511);

$mc->set('123',1);

var_dump($mc->get('123'));

執(zhí)行結(jié)果是:

int(1)

結(jié)論

memcache擴(kuò)展和memcached擴(kuò)展讀寫數(shù)組數(shù)據(jù)不相兼容的原因是胧谈,memcached為了詳細(xì)地區(qū)分?jǐn)?shù)據(jù)類型,定義了各種數(shù)據(jù)類型的標(biāo)示荸频,而導(dǎo)致其中數(shù)組的標(biāo)識(shí)與memcache定義的數(shù)組標(biāo)識(shí)不一致導(dǎo)致菱肖。 經(jīng)過這次探究,也讓我認(rèn)識(shí)到許多memcached比memcache更優(yōu)秀的地方旭从,相信隨著php7的普及稳强,memcache會(huì)加速地被歷史所淘汰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末和悦,一起剝皮案震驚了整個(gè)濱河市退疫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸽素,老刑警劉巖褒繁,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異馍忽,居然都是意外死亡棒坏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門遭笋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坝冕,“玉大人,你說我怎么就攤上這事瓦呼∥箍撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵吵血,是天一觀的道長(zhǎng)谎替。 經(jīng)常有香客問我,道長(zhǎng)蹋辅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任挫掏,我火速辦了婚禮侦另,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尉共。我一直安慰自己褒傅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布袄友。 她就那樣靜靜地躺著殿托,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剧蚣。 梳的紋絲不亂的頭發(fā)上支竹,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天旋廷,我揣著相機(jī)與錄音,去河邊找鬼礼搁。 笑死饶碘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馒吴。 我是一名探鬼主播扎运,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼饮戳!你這毒婦竟也來了豪治?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤扯罐,失蹤者是張志新(化名)和其女友劉穎鬼吵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篮赢,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齿椅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了启泣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涣脚。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖寥茫,靈堂內(nèi)的尸體忽然破棺而出遣蚀,到底是詐尸還是另有隱情,我是刑警寧澤纱耻,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布芭梯,位于F島的核電站,受9級(jí)特大地震影響弄喘,放射性物質(zhì)發(fā)生泄漏玖喘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一蘑志、第九天 我趴在偏房一處隱蔽的房頂上張望累奈。 院中可真熱鬧,春花似錦急但、人聲如沸澎媒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)戒努。三九已至,卻和暖如春镐躲,著一層夾襖步出監(jiān)牢的瞬間储玫,已是汗流浹背侍筛。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缘缚,地道東北人勾笆。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像桥滨,于是被迫代替她去往敵國(guó)和親窝爪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1齐媒、memcache的概念蒲每? Memcache是一個(gè)高性能的分布式的內(nèi)存對(duì)象緩存系統(tǒng),通過在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨...
    桖辶殤閱讀 2,239評(píng)論 2 12
  • redis這個(gè)新產(chǎn)品在sns時(shí)很火喻括,而memcache早就存在邀杏, 但redis提供出來的功能,好多網(wǎng)站均把它當(dāng)me...
    常曉曉閱讀 968評(píng)論 1 8
  • PHP7 已經(jīng)出來1年了唬血,PHP7.1也即將和大家見面望蜡,這么多好的特性,好的方法拷恨,為什么不使用呢脖律,也希望PHP越來...
    夢(mèng)幻_78af閱讀 2,097評(píng)論 1 10
  • 1.為什么要使用memcache 由于網(wǎng)站的高并發(fā)讀寫需求,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)開始出現(xiàn)瓶頸腕侄,例如: 1)對(duì)數(shù)據(jù)庫(kù)的...
    蘇文星閱讀 1,790評(píng)論 0 5
  • 資訊類:人人 :http://www.woshipm.com/36氪:http://36kr.com/小泉,看Next...
    斯瓦西里閱讀 1,613評(píng)論 2 11