2012-08-12 67 views
11

我一直在尋找在php docs on memcache,發現的,而不是做
$mem->connect('localhost', 11211)我可以做的,而不是
$mem->addServer('localhost', 11211)內存緩存連接VS addServer

而這樣一來,如果我沒有最終使用內存緩存的連接,它贏得別再打擾了。

這讓我想知道,爲什麼有人會使用connect()而不是addServer()

這似乎是一個可能的不必要的連接。我錯過了什麼嗎?

回答

10

connectpconnect似乎是更低級別的調用,它們執行單個任務時沒有太多開銷。 addServer OTOH更高級別,管理多臺服務器,當其中一臺服務器出現故障時重試,等等。我的印象是後者依靠前者來完成任務。

從最終用戶的角度來看,確實有點優勢在使用較低級別的功能,也許除了作爲一個小的性能提升(如果你知道你會使用連接向右走,只有一個memcached服務器並且不需要保持持續連接 - 或者實際上想要將其重置以用於故障排除等 - 根據需要連接可能更快)。只有當您需要對連接生命週期進行更多控制時(例如,如果您正在設計自己的緩存策略),這些功能纔會有用。

換句話說,這些函數暴露在API中的事實並不意味着它們會有一個通用的用例。儘管如此,提供更多的工具來與系統進行交互比通常更少,因爲它鼓勵了平臺構建。

3

的差異實際上是解釋相當不錯的文檔頁面上Memcache::addServer

連接()使得以分佈式緩存的單個實例的直接連接。

addServer()向Memcache擴展使用的服務器池添加一個條目,但直到您執行需要連接的操作時纔會實際連接。

當使用此方法(而不是Memcache :: connect()和Memcache :: pconnect())時,直到實際需要時才建立網絡連接。因此,向池中添加大量服務器沒有任何開銷,即使它們可能並未全部使用。

使用服務器池意味着如果一個memcached實例/連接拋出低級錯誤,則Memcache擴展將自動連接到另一個服務器以發出請求。

3

Memcache是​​一個分佈式緩存設計。當您使用服務器池時,對象將通過密鑰分發機制存儲在所有服務器上,該機制根據服務器的權重和密鑰本身的散列來選擇服務器。現在

,在2臺內存緩存服務器的設置,一會是這樣的:

$memcache = new Memcache; 
$memcache->addServer('memcache_host1', 11211); 
$memcache->addServer('memcache_host2', 11211); 

發佈這些調用,PHP的過程中會看到兩個服務器的服務器池,並均勻地分佈對象給他們在Memcache :: addServer調用中選擇默認權重。因此,調用Memcache :: get或Memcache :: set將根據密鑰從服務器池中保存對象或從正確的主機檢索鍵值。

但是,Memcache :: connect會重新初始化主機池,並假定只有一個主機可用,並且所有對象都存儲在該主機上。這也意味着,如果你這樣做:

$memcache = new Memcache; 
$memcache->addServer('memcache_host1', 11211); 
$memcache->addServer('memcache_host2', 11211); 

$memcache->connect('memcache_host1', 11211); 

的最後一次通話將清除服務器池和內存緩存::連接呼叫將memcache_host1保存後的所有按鍵。因此,Memcache :: connect最好在單個主機設置上使用,永遠不要使用池,除非有意與池中的特定主機通信以獲取統計信息,維護操作或特殊緩存方案。更多討論here