欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

對memcache分布式的一點理解

系統 1711 0

pecl的memcache擴展(注意,不是memcache的擴展,兩者不同)中連接memcache服務器有兩種方式:

1.短連接(Memcache::connect)

使用方法 Memcache::connect() 打開的連接在腳本執行結束后會自動關閉。當然,你也可以使用方法 Memcache::close() 來主動關閉?

2.長連接(Memcache::connect)

這個連接不會在腳本執行結束后或者 Memcache::close() 被調用后關閉,持久化連接僅僅會在web服務器關機/重啟時關閉?。

?

memcache的分布式是通過?Memcache::addServer這個方法實現的,下面在windows下測試memcache的分布式實現

1.在命令行啟動兩個memcache服務器,分別監聽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??//查看服務器當前狀態

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

?

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


根據上面的測試情況,發現
1.兩個memcache服務器當前連接數(curr_connections)都是2,這是因為?

$cache -> addServer( $ele [ " host " ] , $ele [ " port " ] , true , $ele [ " weight " ] ) ?第三個參數指定使用長連接,所以每個memcache服務器保存了兩個連接:一個是php里的長連接,一個是telnet登陸的連接(如果不信,我們多刷新幾次 index .php這個頁面,再調用stats命令,發現兩臺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%的權重不符,但是相信緩存項越多,越趨近這個權重。

?

?

?

在多做幾次實驗還會發現:?

?(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分布式的一點理解

? 我們發現php程序嘗試去連接127.0.0.1:11212發現其不在線后又去127.0.0.1:11211找到了對應的緩存項,這和設置緩存時 分布式緩存分配算法 的表現是一致的
? 奇怪的是接著打開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服務器上的,接著發現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 " ] );

發 現無論刷新多少次localhost/index.php和localhost/get.php,stats 127.0.0.1:11211和127.0.0.1:11212會看到curr_connections總為1,這是因為使用短連接后每一次頁面腳本執 行完畢都會關掉連接,所以兩個memcache服務器都只有telnet一個連接在線。

?

(3) 加入set和get的memcache服務器連接池的連接一樣但是順序不一樣,會發現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分布式的一點理解


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 午夜大片免费男女爽爽影院久久 | 老人与老人免费a级毛片 | a一级黄 | 欧美久久久久 | 色综合久久久久久久久五月性色 | 欧美日韩国产一区二区三区 | 九九久久国产精品大片 | 成人亚洲A片V一区二区三区婷婷 | 亚洲成人综合视频 | 色婷婷社区 | 夜夜操网| 欧美精品1区2区3区 国产午夜精品理论片影院 亚洲精品不卡久久久久久 三级网站免费观看 | 国产无遮挡一级毛片 | 亚洲国产香蕉视频欧美 | 久久久久久久一区二区三区 | 天天摸天天做天天爽 | 成人午夜免费视频毛片 | 久草论坛 | 国内精品久久久久影院老司 | www.久久久.com| 亚洲精品综合久久 | 亚洲综合欧美日韩 | 国产精品美女久久久久久久网站 | 美女羞羞网站妖精视频 | 精品国产成a人在线观看 | 欧美永久精品 | 国产下药迷倒白嫩美女96 | 夜夜操天天射 | 免费精品美女久久久久久久久久 | av资源在线天堂 | 欧洲亚洲精品久久久久 | 91精品视频在线播放 | 自拍偷拍亚洲欧美 | 精品国产一区二区三区成人影院 | 深爱五月综合网 | 中文字幕精品一区久久久久 | 国产精品观看在线亚洲人成网 | 午夜影院在线观看 | 天天更新天天久久久更新影院 | 日本三级香港三级乳网址 | 久草精彩视频 |