2012-12-23 128 views
1

所以我剛開始使用Memcache。我準備寫一些代碼,但是我有一個優化問題:我應該避免建立MySQL連接(使用Memcache時)還是建立連接?

我不知道是否應該儘可能延遲建立MySQL連接(並且可能沒有建立一個連接,當一切都可以從Memcache中讀取時)或者無論如何建立它,以節省我的編碼時間,基於這樣的想法,不是連接,而是實際的查詢使我的服務器的CPU變得瘋狂。

所以,我有這兩個代碼示例之間做出選擇:

1 - 連接到MySQL反正

$memcache = new Memcache; 
$memcache->connect('localhost', 11211) or die ("MEMCACHE: Could not connect!"); 
$db = mysql_connect('localhost', 'user', 'password') or die ("MySQL: Could not connect!"); 
mysql_select_db('database'); 

$sql = "SELECT id FROM table LIMIT 1"; 
$key = md5('query'.$sql); 
//lookup value in memcache 
$result = $memcache->get($key); 
//check if we got something back 
if($result == null) { 
//fetch from database 
$qry = mysql_query($sql) or die(mysql_error()." : $sql"); 
if(mysql_num_rows($qry)> 0) { 
    $result = mysql_fetch_object($qry); 
    //store in memcache for 60 seconds 
    $memcache->set($key,$result,0,60); 
    } 
} 

2 - 只要連接到MySQL,因爲它需要

$memcache = new Memcache; 
$memcache->connect('localhost', 11211) or die ("MEMCACHE: Could not connect!"); 

$sql = "SELECT id FROM table LIMIT 1"; 
$key = md5('query'.$sql); 
//lookup value in memcache 
$result = $memcache->get($key); 
//check if we got something back 
if($result == null) { 

if(!$db){ 
    $db = mysql_connect('localhost', 'user', 'password') or die ("MySQL: Could not connect!"); 
    mysql_select_db('database'); 
} 

//fetch from database 
$qry = mysql_query($sql) or die(mysql_error()." : $sql"); 
if(mysql_num_rows($qry)> 0) { 
    $result = mysql_fetch_object($qry); 
    //store in memcache for 60 seconds 
    $memcache->set($key,$result,0,60); 
    } 
} 

回答

2

只有當你需要它時,才能連接到mySQL(和其他東西)。這樣你可以減少應用程序在這種情況下網絡連接所需的資源。並且不要將負載加載到數據庫服務器。

一般經驗法則:只在需要時才使用資源。

0

如果速度很重要,請事先獲得連接。開放並不是一個很大的資源,但它可能需要一段時間才能建立。另外,如果出現問題(例如數據庫服務器關閉),則通過早期連接就可以知道應用程序啓動,並且您可以確認一切都很順利,而不是在稍後可能知道的時候泄漏並修復了問題是因爲問題。

您可能想要更進一步並運行心跳查詢來斷言數據庫仍存在如此相似的原因。

請注意,這種方法使數據庫需要爲您的應用程序啓動。你可以在兩者之間做一些事情:在啓動時獲得連接,但如果它不可用,則可以回到剛好時間的方法,這爲您提供了更大的靈活性。這就是我要做的。

+0

這種效果並不理想,如果將數據存儲在memcache中,則至少可以爲您的站點提供只讀版本(假設您大多數都具有讀取),並且只有在寫入完成時纔會顯示錯誤,這是更優選的。至於網站正在啓動,您應該對您的服務器進行某種監控。 – Aviatrix

0

我認爲這取決於併發性。但是,將線程安全池中的連接緩存更好。

在許多Web應用程序中,建立數據庫連接並將其放入線程安全池,因爲建立連接非常昂貴。

好像從memcached中獲取數據不是直接從數據庫中獲取數據,因爲它速度更快,可以容納很多線程。

0

看着你提供的代碼(通常是上世紀風格的意大利細麪條),我會爲第一個投票。
無論添加到程序流中的邏輯如何,都會使代碼更復雜十倍。所以,最好儘可能地說清楚。

或者,甚至,我建議不要使用memcache,直到你學會如何分離和封裝不同的事情。
尤其是因爲您可以通過主鍵從數據庫獲取緩存數據沒有意義。