PHP模塊 Memcached功能多于Memcache
更新時(shí)間:2011年06月14日 22:44:04 作者:
PHP搭配Memcached已經(jīng)是婦孺皆知的標(biāo)配了。再提似乎讓人覺得太“圡”了,不過有一些細(xì)節(jié)不見得人人都清楚
比如說PECL里有兩個(gè)Memcached的模塊,Memcache和Memcached,目前大部分PHP環(huán)境里使用的是名字里不帶d的Memcache版本,這個(gè)版本釋出的比較早,是一個(gè)原生版本,與之對應(yīng)的帶d的Memcached版本則是建立在libmemcached的基礎(chǔ)上,所以說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
打開php.ini加上:
extension = "memcached.so"
這樣安裝就結(jié)束了,你可以通過下列命令來確認(rèn):
php -m | grep mem
演示Memcached版本的新功能
先虛構(gòu)一個(gè)問題,假設(shè)counter初始值是一個(gè)整數(shù),不使用increment方法,通過get/set完成每次加一。
在Memcache版本里,我們只能按照大致如下的方式來進(jìn)行:
$m = new Memcache();
$m->addServer('localhost', 11211);
$v = $m->get('counter');
$m->set('counter', $v + 1);
由于get/set這兩個(gè)動(dòng)作無法作為一個(gè)原子來操作,所以當(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版本里提供的功能,說白了就是一個(gè)樂觀鎖的功能,如果你把$token的值var_dump出來,就會(huì)發(fā)現(xiàn)$token其實(shí)就是一個(gè)版本號,如果通過get得到的$token版本號在cas的時(shí)候不對應(yīng),就說明已經(jīng)有別的操作更新了,此時(shí)cas操作會(huì)失敗,至于如何繼續(xù)操作,就看你自己了。
注:如果你想手動(dòng)重現(xiàn)一下沖突的情況,可在get和cas之間sleep若干秒,并拷貝兩份腳本,先后執(zhí)行。
順便說一句,推薦的Memcached版本模塊的哈希設(shè)置如下:
$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
總結(jié)
Memcached版本還有很多Memcache沒有的功能,比如通過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
打開php.ini加上:
extension = "memcached.so"
這樣安裝就結(jié)束了,你可以通過下列命令來確認(rèn):
php -m | grep mem
演示Memcached版本的新功能
先虛構(gòu)一個(gè)問題,假設(shè)counter初始值是一個(gè)整數(shù),不使用increment方法,通過get/set完成每次加一。
在Memcache版本里,我們只能按照大致如下的方式來進(jìn)行:
$m = new Memcache();
$m->addServer('localhost', 11211);
$v = $m->get('counter');
$m->set('counter', $v + 1);
由于get/set這兩個(gè)動(dòng)作無法作為一個(gè)原子來操作,所以當(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版本里提供的功能,說白了就是一個(gè)樂觀鎖的功能,如果你把$token的值var_dump出來,就會(huì)發(fā)現(xiàn)$token其實(shí)就是一個(gè)版本號,如果通過get得到的$token版本號在cas的時(shí)候不對應(yīng),就說明已經(jīng)有別的操作更新了,此時(shí)cas操作會(huì)失敗,至于如何繼續(xù)操作,就看你自己了。
注:如果你想手動(dòng)重現(xiàn)一下沖突的情況,可在get和cas之間sleep若干秒,并拷貝兩份腳本,先后執(zhí)行。
順便說一句,推薦的Memcached版本模塊的哈希設(shè)置如下:
$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
總結(jié)
Memcached版本還有很多Memcache沒有的功能,比如通過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)開發(fā)教程⑥ 微信開發(fā)集成類的使用圖文詳解
這篇文章主要介紹了微信公眾平臺(tái)開發(fā)之微信開發(fā)集成類的使用,結(jié)合圖文形式詳細(xì)分析了微信開發(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)分頁功能簡單示例
這篇文章主要介紹了PHP ADODB實(shí)現(xiàn)分頁功能,結(jié)合實(shí)例形式分析了php使用ADODB實(shí)現(xiàn)分頁功能相關(guān)操作技巧,需要的朋友可以參考下2018-05-05