PHP模塊 Memcached功能多于Memcache
更新時(shí)間:2011年06月14日 22:44:04 作者:
PHP搭配Memcached已經(jīng)是婦孺皆知的標(biāo)配了。再提似乎讓人覺(jué)得太“圡”了,不過(guò)有一些細(xì)節(jié)不見(jiàn)得人人都清楚
比如說(shuō)PECL里有兩個(gè)Memcached的模塊,Memcache和Memcached,目前大部分PHP環(huán)境里使用的是名字里不帶d的Memcache版本,這個(gè)版本釋出的比較早,是一個(gè)原生版本,與之對(duì)應(yīng)的帶d的Memcached版本則是建立在libmemcached的基礎(chǔ)上,所以說(shuō)Memcached版本的功能更全一些。
安裝Memcached版本的PHP模塊
wget http://download.tangent.org/libmemcached-0.35.tar.gz
tar zxf libmemcached-0.35.tar.gz
cd libmemcached-0.35
./configure
make
make install
wget http://pecl.php.net/get/memcached-1.0.0.tgz
tar zxf memcached-1.0.0.tgz
cd memcached-1.0.0
phpize
./configure
make
make install
打開(kāi)php.ini加上:
extension = "memcached.so"
這樣安裝就結(jié)束了,你可以通過(guò)下列命令來(lái)確認(rèn):
php -m | grep mem
演示Memcached版本的新功能
先虛構(gòu)一個(gè)問(wèn)題,假設(shè)counter初始值是一個(gè)整數(shù),不使用increment方法,通過(guò)get/set完成每次加一。
在Memcache版本里,我們只能按照大致如下的方式來(lái)進(jìn)行:
$m = new Memcache();
$m->addServer('localhost', 11211);
$v = $m->get('counter');
$m->set('counter', $v + 1);
由于get/set這兩個(gè)動(dòng)作無(wú)法作為一個(gè)原子來(lái)操作,所以當(dāng)多個(gè)進(jìn)程同時(shí)處理時(shí),會(huì)出現(xiàn)丟失的可能,更讓人惱火的是,你根本就不知道什么時(shí)候出現(xiàn)丟失。
再看看Memcached版本里,我們是如何做的:
$md = new Memcached();
$md->addServer('localhost', 11211);
$v = $md->get('counter', null, $token)
$md->cas($token, 'counter', $v + 1);
cas是Memcached版本里提供的功能,說(shuō)白了就是一個(gè)樂(lè)觀鎖的功能,如果你把$token的值var_dump出來(lái),就會(huì)發(fā)現(xiàn)$token其實(shí)就是一個(gè)版本號(hào),如果通過(guò)get得到的$token版本號(hào)在cas的時(shí)候不對(duì)應(yīng),就說(shuō)明已經(jīng)有別的操作更新了,此時(shí)cas操作會(huì)失敗,至于如何繼續(xù)操作,就看你自己了。
注:如果你想手動(dòng)重現(xiàn)一下沖突的情況,可在get和cas之間sleep若干秒,并拷貝兩份腳本,先后執(zhí)行。
順便說(shuō)一句,推薦的Memcached版本模塊的哈希設(shè)置如下:
$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
總結(jié)
Memcached版本還有很多Memcache沒(méi)有的功能,比如通過(guò)getByKey, setByKey等自動(dòng)支持多個(gè)服務(wù)器,就不贅述了,該用哪個(gè)擴(kuò)展已經(jīng)不言自明了。
補(bǔ)充:http://code.google.com/p/memcached/wiki/PHPClientComparison
安裝Memcached版本的PHP模塊
wget http://download.tangent.org/libmemcached-0.35.tar.gz
tar zxf libmemcached-0.35.tar.gz
cd libmemcached-0.35
./configure
make
make install
wget http://pecl.php.net/get/memcached-1.0.0.tgz
tar zxf memcached-1.0.0.tgz
cd memcached-1.0.0
phpize
./configure
make
make install
打開(kāi)php.ini加上:
extension = "memcached.so"
這樣安裝就結(jié)束了,你可以通過(guò)下列命令來(lái)確認(rèn):
php -m | grep mem
演示Memcached版本的新功能
先虛構(gòu)一個(gè)問(wèn)題,假設(shè)counter初始值是一個(gè)整數(shù),不使用increment方法,通過(guò)get/set完成每次加一。
在Memcache版本里,我們只能按照大致如下的方式來(lái)進(jìn)行:
$m = new Memcache();
$m->addServer('localhost', 11211);
$v = $m->get('counter');
$m->set('counter', $v + 1);
由于get/set這兩個(gè)動(dòng)作無(wú)法作為一個(gè)原子來(lái)操作,所以當(dāng)多個(gè)進(jìn)程同時(shí)處理時(shí),會(huì)出現(xiàn)丟失的可能,更讓人惱火的是,你根本就不知道什么時(shí)候出現(xiàn)丟失。
再看看Memcached版本里,我們是如何做的:
$md = new Memcached();
$md->addServer('localhost', 11211);
$v = $md->get('counter', null, $token)
$md->cas($token, 'counter', $v + 1);
cas是Memcached版本里提供的功能,說(shuō)白了就是一個(gè)樂(lè)觀鎖的功能,如果你把$token的值var_dump出來(lái),就會(huì)發(fā)現(xiàn)$token其實(shí)就是一個(gè)版本號(hào),如果通過(guò)get得到的$token版本號(hào)在cas的時(shí)候不對(duì)應(yīng),就說(shuō)明已經(jīng)有別的操作更新了,此時(shí)cas操作會(huì)失敗,至于如何繼續(xù)操作,就看你自己了。
注:如果你想手動(dòng)重現(xiàn)一下沖突的情況,可在get和cas之間sleep若干秒,并拷貝兩份腳本,先后執(zhí)行。
順便說(shuō)一句,推薦的Memcached版本模塊的哈希設(shè)置如下:
$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
總結(jié)
Memcached版本還有很多Memcache沒(méi)有的功能,比如通過(guò)getByKey, setByKey等自動(dòng)支持多個(gè)服務(wù)器,就不贅述了,該用哪個(gè)擴(kuò)展已經(jīng)不言自明了。
補(bǔ)充:http://code.google.com/p/memcached/wiki/PHPClientComparison
您可能感興趣的文章:
相關(guān)文章
PHP二維數(shù)組實(shí)現(xiàn)去除重復(fù)項(xiàng)的方法【保留各個(gè)鍵值】
這篇文章主要介紹了PHP二維數(shù)組實(shí)現(xiàn)去除重復(fù)項(xiàng)的方法,結(jié)合實(shí)例形式分析了php保留各個(gè)鍵值的情況下去除重復(fù)項(xiàng)的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12微信公眾平臺(tái)開(kāi)發(fā)教程⑥ 微信開(kāi)發(fā)集成類的使用圖文詳解
這篇文章主要介紹了微信公眾平臺(tái)開(kāi)發(fā)之微信開(kāi)發(fā)集成類的使用,結(jié)合圖文形式詳細(xì)分析了微信開(kāi)發(fā)集成類的原理、功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-04-04php中郵箱地址正則表達(dá)式實(shí)現(xiàn)與詳解
本文章不但要講述了關(guān)于正則達(dá)式而且還講述了關(guān)于郵箱正則的構(gòu)成用法詳解,有需要了解的朋友可以參考一下,同時(shí)我們也提供了多種不同的郵箱驗(yàn)證實(shí)例2012-04-04PHP ADODB實(shí)現(xiàn)分頁(yè)功能簡(jiǎn)單示例
這篇文章主要介紹了PHP ADODB實(shí)現(xiàn)分頁(yè)功能,結(jié)合實(shí)例形式分析了php使用ADODB實(shí)現(xiàn)分頁(yè)功能相關(guān)操作技巧,需要的朋友可以參考下2018-05-05