摘要:背景最近公司許多團隊進行升級,目前支持讀取的擴展只有。驗證驗證擴展和擴展讀寫數組數據是否不相兼容測試腳本執行結果從結果來看,印證了我們之前的說法。為了保證擴展和擴展直接寫的數據可以相互讀取,只能用的格式寫入。
背景
最近公司許多團隊進行升級php7,目前支持php7讀取mc的擴展只有memcached。
但是公司許多項目都會共用一個mc集群來存取用戶session數據,存的時候是登陸時用memcache擴展以array的形式寫進去,讀的時候自然是用memcache擴展以array的形式讀出來。 但是現在只能使用memcached進行讀取。但是據我所知兩者讀取array形式的數據是互不兼容的,因此想探究一下究竟是為什么。
驗證memcache擴展和memcached擴展讀寫數組數據是否不相兼容
測試腳本:
</>復制代碼
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 ============
";
$key2 = "testArray";
$mc->set($key2, [1,2,3]);
var_dump($mc->get($key2));
var_dump($mc2->get($key2));
執行結果:
</>復制代碼
? ~ 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)
從結果來看,印證了我們之前的說法。
猜測原因由于string沒有問題,出問題是在array格式里面。所以懷疑是array存進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));
執行結果:
</>復制代碼
? ~ 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進行查看
</>復制代碼
? ~ telnet 10.199.189.129 11511
Trying 10.199.189.129...
Connected to 10.199.189.129
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
從結果來看,我們可以發現,memcache和memcached寫到mc里面的結果是一樣的,也就是說我們的猜測是錯誤的。兩個值的序列化處理一模一樣,區別在于值的flag不同。 memcache存儲array數據的時候,falg為1,而memcached為4. 我們知道,mc中值的flag是提供給使用者自定義,方便再讀取的時候做不同的處理。但是為什么兩者的flag定義會不相同呢。 抱著這個疑問,試著通過閱讀兩個擴展的源碼查找原因。
閱讀兩個擴展的源碼 memcachephp_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
經閱讀源碼,發現memcache將array的數組格式的flag定義為1,而memcached為了將php存進mc中的值進行詳細的類型區分,將數據類型定義了string,long,double等等的數據類型。
也就是說,當你使用memcache的時候,運行
</>復制代碼
addServer("10.199.189.129", 11511);
$mc->set("123",1);
var_dump($mc->get("123"));
執行結果是:
</>復制代碼
string(1) "1"
你明明存了一個值為數字1的key,但是讀取的時候卻為字符串。 而當你使用memcached的時候,運行
</>復制代碼
addServer("10.199.189.129", 11511);
$mc->set("123",1);
var_dump($mc->get("123"));
執行結果是:
</>復制代碼
int(1)
結論
memcache擴展和memcached擴展讀寫數組數據不相兼容的原因是,memcached為了詳細地區分數據類型,定義了各種數據類型的標識,而其中數組的標識與memcache定義的數組標識不一致導致。
為了保證memcache擴展和memcached擴展直接寫的數據可以相互讀取,只能用string的格式寫入mc。
經過這次探究,也讓我認識到許多memcached比memcache更優秀的地方,相信隨著php7的普及,memcache會加速地被歷史所淘汰。
轉載注明來源:
作者: Akay
本文地址: [http://www.akayzhang.com/arti...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/61702.html
摘要:背景最近公司許多團隊進行升級,目前支持讀取的擴展只有。驗證驗證擴展和擴展讀寫數組數據是否不相兼容測試腳本執行結果從結果來看,印證了我們之前的說法。為了保證擴展和擴展直接寫的數據可以相互讀取,只能用的格式寫入。 背景 最近公司許多團隊進行升級php7,目前支持php7讀取mc的擴展只有memcached。但是公司許多項目都會共用一個mc集群來存取用戶session數據,存的時候是登陸時用...
摘要:以下正文的部分內容來自程序員面試筆試寶典書籍,如果轉載請保留出處一什么是是一個開源免費高性能的分布式對象緩存系統,它基于一個存儲鍵值對的來存儲數據到內存中。預告面試常考內容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發布的PHP面試常考內容之面向對象專題后,發布的第二個專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內容點為以下幾點,更新時...
摘要:以下正文的部分內容來自程序員面試筆試寶典書籍,如果轉載請保留出處一什么是是一個開源免費高性能的分布式對象緩存系統,它基于一個存儲鍵值對的來存儲數據到內存中。預告面試常考內容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發布的PHP面試常考內容之面向對象專題后,發布的第二個專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內容點為以下幾點,更新時...
摘要:安裝擴展支持在服務以及擴展中,默認都是不支持用戶名和密碼,但是如果需要可以通過打開來提供用戶名和密碼服務。最后在修改對應的文件增加擴展重啟,大功告成以上內容僅供參考 Mac安裝memcached擴展支持sasl Memcached在服務以及擴展中,默認都是不支持用戶名和密碼,但是如果需要可以通過打開sasl來提供用戶名和密碼服務。所以在memcached的擴展與服務器安裝時都需要啟用s...
摘要:安裝擴展支持在服務以及擴展中,默認都是不支持用戶名和密碼,但是如果需要可以通過打開來提供用戶名和密碼服務。最后在修改對應的文件增加擴展重啟,大功告成以上內容僅供參考 Mac安裝memcached擴展支持sasl Memcached在服務以及擴展中,默認都是不支持用戶名和密碼,但是如果需要可以通過打開sasl來提供用戶名和密碼服務。所以在memcached的擴展與服務器安裝時都需要啟用s...
閱讀 3407·2023-04-25 20:37
閱讀 3148·2021-09-07 09:59
閱讀 1672·2019-08-29 12:43
閱讀 1192·2019-08-28 18:27
閱讀 485·2019-08-26 13:50
閱讀 2037·2019-08-26 10:33
閱讀 3600·2019-08-23 18:39
閱讀 2404·2019-08-23 18:09
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要