亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

對memcache分布式的一點理解

系統(tǒng) 1622 0

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? 11211 ? start

memcached . exe?-p? 11212 ? start ?

?

?2.將以下php代碼保存到localhost/index.php,用瀏覽器瀏覽一次index.php

? <? php

???? function ?createCache()
????{
????????
$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)

結果如下圖所示:
對memcache分布式的一點理解 ?

?

//第二個窗口
telnet?
127.0 . 0.1 ? 11212 ? //先登入memcache服務器
stats??//查看服務器當前狀態(tài)
結果如下圖所示:
對memcache分布式的一點理解


根據(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,頁面輸出如下內容:
對memcache分布式的一點理解

?

?在命令行 telnet 127.0.0.1 11211 再stats,得到如下結果:

? 對memcache分布式的一點理解

通過上面的結果我們得出結論, 當一個memcache連接池的某個服務器down掉以后,通過memcache分布式緩存分配算法分配到down掉的服務器的緩存不會被丟棄,而是會存儲到另外的服務器上。

再編寫一個存儲到localhost/get.php的get.php ,內容如下:

? <? php

function ?createCache()?{
????
$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,內容輸出如下:
對memcache分布式的一點理解

? 我們發(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,輸出內容如下:
對memcache分布式的一點理解
為什么明明緩存在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 " ] ); ????

改為??

$cache -> addServer( $ele [ " host " ] , $ele [ " port " ] ,false , $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的時候使用如下連接池:

? $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%
????????);

get的時候使用如下連接池:

$arr = array (? ???????????
? ? ? ? ?? array ( " host " => " 127.0.0.1 " , " port " => 11212 , " weight " => 80 ) ,? // 127.0.0.1:11212的權重是80%????
?????????? array ( " host " => " 127.0.0.1 " , " port " => 11211 , " weight " => 20 ) // 127.0.0.1:11211的權重是20% ??????????
??????? );

?

?

對memcache分布式的一點理解


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 免费黄色的视频 | 99香蕉国产 | 日本一区二区免费视频 | 国内精品免费一区二区观看 | 97天天干 | 日日摸夜夜添夜夜添欧美毛片 | 一本到视频在线观看 | 变态捡到女婴h养成调教 | 亚洲第二页 | 国产精品久久久久秋霞影视 | 日韩操 | 国产精品婷婷久青青原 | 99热这里只有精品8 99热这里只有精品88 | 狠狠操夜夜操 | 四虎影视精品永久免费网站 | 亚洲国产最新在线一区二区 | 中文精品久久久久国产不卡 | 日韩在线观看视频网站 | 欧美大狠狠大臿蕉香蕉大视频 | 欧美专区综合 | 亚洲美色综合天天久久综合精品 | 国产1769一七六九视频在线 | 欧美香蕉爽爽人人爽观看猫咪 | 四虎国产精品永久地址99 | 亚洲精品一二三四区 | 国产在线不卡视频 | 色婷婷色综合缴情在线 | 精品牛牛影视久久精品 | 久久久久免费精品视频 | 亚洲欧美日韩国产vr在线观 | 国产真实自拍 | 日韩欧美a级高清毛片 | 狠狠色丁香婷婷久久综合2021 | 久草在线中文最新视频 | 99ri国产| 久久精品久噜噜噜久久 | 亚洲黄色小视频 | 国产欧美日韩综合一区二区三区 | 99精品国产在这里白浆 | 欧美性狂猛bbbbxxxx | 色插综合 |