pecl的memcache擴展(注意,不是memcache的擴展,兩者不同)中連接memcache服務器有兩種方式:
1.短連接(Memcache::connect)
使用方法 Memcache::connect() 打開的連接在腳本執(zhí)行結束后會自動關閉。當然,你也可以使用方法 Memcache::close() 來主動關閉?
2.長連接(Memcache::connect)
這個連接不會在腳本執(zhí)行結束后或者 Memcache::close() 被調用后關閉,持久化連接僅僅會在web服務器關機/重啟時關閉?。
?
memcache的分布式是通過?Memcache::addServer這個方法實現(xiàn)的,下面在windows下測試memcache的分布式實現(xiàn)
1.在命令行啟動兩個memcache服務器,分別監(jiān)聽11211和11212端口:
memcached . exe?-p? 11212 ? start ?
?
?2.將以下php代碼保存到localhost/index.php,用瀏覽器瀏覽一次index.php
? <? php
????{
???????? $arr = array (??
???????????? array ( " host " => " 127.0.0.1 " , " port " => 11211 , " weight " => 20 ) , // 127.0.0.1:11211的權重是20%
???????????? array ( " host " => " 127.0.0.1 " , " port " => 11212 , " weight " => 80 ) ,? // 127.0.0.1:11212的權重是80%
????????);
???????? $cache = new ?memcache;
???????? foreach ?( $arr ? as ? $ele ?)
????????{
? ? //使用長連接,并且設置不同memcache服務器的權重,將memcache服務器添加到連接池
???????????? $cache -> addServer( $ele [ " host " ] , $ele [ " port " ] , true , $ele [ " weight " ] );????????????
????????}
???????? return ? $cache ;
????}
? ? $cache ? = ?createCache?();
? ? for ( $i = 0 ; $i < 10 ; $i ++ )
? ? {
//由于使用了分布式,所以這里不需要使用connect或者pconnect打開鏈接,set方法會調用memcache的分布式緩存分配算法,按照權重將緩存項緩存到連接池的某個服務器
? ? ? ?? if ( $cache -> set( $i , $i , 0 , 3600 ))
? ? ? ? {
? ? ? ? ? ?? echo ? " 緩存成功,key: $i ,value: $i " ;
? ? ? ? } else ?
? ? ? ? {
? ? ? ? ? ?? echo ? " 緩存失敗 " ;
? ? ? ? }
? ? ? ?? echo ? " <br/> " ;
? ? }
?>
?
3.再開啟兩個cmd窗口,分別輸入如下內容:
telnet? 127.0 . 0.1 ? 11211 ? //先登入memcache服務器
stats??//查看服務器當前狀態(tài)
結果如下圖所示:
?
?
//第二個窗口
telnet?
127.0
.
0.1
?
11212 ? //先登入memcache服務器
stats??//查看服務器當前狀態(tài)
結果如下圖所示:
根據(jù)上面的測試情況,發(fā)現(xiàn)
1.兩個memcache服務器當前連接數(shù)(curr_connections)都是2,這是因為?
$cache
->
addServer(
$ele
[
"
host
"
]
,
$ele
[
"
port
"
]
,
true
,
$ele
[
"
weight
"
]
) ?第三個參數(shù)指定使用長連接,所以每個memcache服務器保存了兩個連接:一個是php里的長連接,一個是telnet登陸的連接(如果不信,我們多刷新幾次
index
.php這個頁面,再調用stats命令,發(fā)現(xiàn)兩臺memcache服務器的
curr_connections還是2
)
2.127.0.0.1:11211的current_items為4,
127.0.0.1:11212的current_items為6,這說明十個緩存項有4個存到了第一臺服務器,有6個存到了第二胎服務器,雖然與20%和80%的權重不符,但是相信緩存項越多,越趨近這個權重。
?
?
?
在多做幾次實驗還會發(fā)現(xiàn):?
?(1).將127.0.0.1:11211和
127.0.0.1:11212兩臺memcache服務器都關掉,再打開127.0.0.1:11211,然后訪問index.php,頁面輸出如下內容:
?
?在命令行 telnet 127.0.0.1 11211 再stats,得到如下結果:
?
通過上面的結果我們得出結論, 當一個memcache連接池的某個服務器down掉以后,通過memcache分布式緩存分配算法分配到down掉的服務器的緩存不會被丟棄,而是會存儲到另外的服務器上。
再編寫一個存儲到localhost/get.php的get.php ,內容如下:
? <? php
???? $arr ? = ? array ?( array ?( " host " ? => ? " 127.0.0.1 " , ? " port " ? => ? 11211 , ? " weight " ? => ? 20 ?) , ? array ?( " host " ? => ? " 127.0.0.1 " , ? " port " ? => ? 11212 , ? " weight " ? => ? 80 ?)?);
???? $cache ? = ? new ?memcache?();
???? foreach ?(? $arr ? as ? $ele ?)?{
???????? $cache -> addServer?(? $ele ?[ " host " ] , ? $ele ?[ " port " ] , ? true , ? $ele ?[ " weight " ] , ? 1 ?);
????}
???? return ? $cache ;
}
$cache ? = ?createCache?();
$val ;
for ( $i ? = ? 0 ;? $i ? < ? 10 ;? $i ? ++ )?{
???? $val ? = ? $cache -> get?(? $i ?);
???? if ?( false ? === ? $val )?{
???????? echo ? " 緩存獲取失敗 " ;
????}? else ?{
???????? echo ? " 緩存獲取成功:,key: $val ,value: $val " ;
????}
???? echo ? " <br/> " ;
}
$cache -> close?();
?>
?訪問localhost/get.php,內容輸出如下:
? 我們發(fā)現(xiàn)php程序嘗試去連接127.0.0.1:11212發(fā)現(xiàn)其不在線后又去127.0.0.1:11211找到了對應的緩存項,這和設置緩存時
分布式緩存分配算法
的表現(xiàn)是一致的
? 奇怪的是接著打開127.0.0.1:11212這個memcache服務器后再訪問localhost/get.php,輸出內容如下:
為什么明明緩存在127.0.0.1:11211都存在,卻有6個緩存項顯示找不到緩存呢?我覺得是這樣的:當通過$cache->get獲取緩存的時候,分布式緩存分配算法
推算出6個緩存項是存儲在127.0.0.1:11212這個memcache服務器上的,接著發(fā)現(xiàn)127.0.0.1:11212這個memcache服務器是在線的,所以即使沒有找到對應的緩存也不會像上一步一樣去
127.0.0.1:11211尋找緩存
(2)假設127.0.0.1:11211和127.0.0.1:11212都已經開啟 當我們將
? $cache
->
addServer(
$ele
[
"
host
"
]
,
$ele
[
"
port
"
]
,
true
,
$ele
[
"
weight
"
]
);
????
改為??
后
發(fā) 現(xiàn)無論刷新多少次localhost/index.php和localhost/get.php,stats 127.0.0.1:11211和127.0.0.1:11212會看到curr_connections總為1,這是因為使用短連接后每一次頁面腳本執(zhí) 行完畢都會關掉連接,所以兩個memcache服務器都只有telnet一個連接在線。
?
(3) 加入set和get的memcache服務器連接池的連接一樣但是順序不一樣,會發(fā)現(xiàn)get緩存的時候明明set的所有緩存項都存入了對應的memcache服務器但是很多緩存項就是取不到,既set的時候使用如下連接池:
???????????? array ( " host " => " 127.0.0.1 " , " port " => 11211 , " weight " => 20 ) , // 127.0.0.1:11211的權重是20%
???????????? array ( " host " => " 127.0.0.1 " , " port " => 11212 , " weight " => 80 ) ,? // 127.0.0.1:11212的權重是80%
????????);
get的時候使用如下連接池:
?????????? array ( " host " => " 127.0.0.1 " , " port " => 11211 , " weight " => 20 ) // 127.0.0.1:11211的權重是20% ??????????
?
?
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
